2011-10-21 7 views
16

Sto sviluppando app con minSdkVersion = "11", ovvero app per tablet e Android 4.0 e successivi. Ho esaminato internet su questo argomento, ma non ho trovato molto.android - Come impostare il layout personalizzato per PreferenceActivity in Android 3.0?

Per implementare il layout personalizzato per le versioni precedenti di Android SDK, è sufficiente creare il layout (ad esempio preference.xml) con ListView e il relativo id è uguale a android.R.id.list e utilizzare il metodo setContentView.

preference.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <ListView android:id="@android:id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" /> 
</RelativeLayout> 

In Android 3.0 le cose sono cambiate e le preferenze sono implementate con l'utilizzo di frammenti. È così che il mio file preference_headers.xml assomiglia:

<preference-headers 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

    <header android:fragment="com.example.MyPreferenceActivity$GeneralSettingsFragment" 
      android:title="General" 
      android:summary="Common settings." /> 
    <header 
      android:title="Example.com" > 
     <intent android:action="android.intent.action.VIEW" 
       android:data="http://www.example.com" /> 
    </header> 

</preference-headers> 

MyPreferenceActivity.java:

public class MyPreferenceActivity extends PreferenceActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.preference); 
     // Add a button to the header list. 
     if (hasHeaders()) { 
      Button button = new Button(this); 
      button.setText("Log out"); 
      setListFooter(button); 

     } 

    } 


    /** 
    * Populate the activity with the top-level headers. 
    */ 
    @Override 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.preference_headers, target); 
    } 

    public static class GeneralSettingsFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.fragmented_preferences); 

     } 
    } 
} 

Ora, se corro MyPreferenceActivity vedrò questo errore nel LogCat:

> java.lang.IllegalArgumentException: No view found for id 0x10202be for 
> fragment GeneralSettingsFragment{4077f8c0 #0 id=0x10202be} 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:729) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909) 
> E/AndroidRuntime(17103): at 
> android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584) 
> E/AndroidRuntime(17103): at 
> android.app.Activity.performStart(Activity.java:4377) 
> E/AndroidRuntime(17103): at 
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1724) 
> E/AndroidRuntime(17103): ... 11 more 

I sapere cosa causa questo problema FragmentManager non riesce a trovare una vista per inserire il frammento GeneralSettingsFragment. Ma non so come risolverlo.

A proposito, se eseguo la stessa app su Android 4.0, posso vedere la prima attività di preferenza con le intestazioni. Ma se clicco su Generale, app andrà in crash e mi riceverà errore simile in LogCat:

java.lang.IllegalArgumentException: No view found for id 0x10202cd for fragment GeneralSettingsFragment{4134b4e0 #0 id=0x10202cd} 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:789) 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998) 
E/AndroidRuntime(2170):  at android.app.BackStackRecord.run(BackStackRecord.java:622) 
E/AndroidRuntime(2170):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330) 
E/AndroidRuntime(2170):  at android.app.Activity.performStart(Activity.java:4474) 
E/AndroidRuntime(2170):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928) 
+0

Che cosa stai cercando di fare? Perché hai bisogno di un layout personalizzato? – alexanderblom

+0

Voglio avere un controllo più preciso sull'attività di preferenza. Inoltre, voglio che sia il più possibile compatibile con le versioni più recenti di Android SDK, ovvero ho bisogno di estendere PreferenceActivity, ma non di implementarlo da zero. – morphium

risposta

-1

non è necessario per setContenView. in questo esempio la popolazione di layout viene eseguita tramite intestazioni e frammenti associati, altre parole automaticamente.

+0

So che non ne ho assolutamente bisogno. Ma in questo esempio ho aggiunto Button al piè di pagina List. Ora voglio personalizzare la visualizzazione in modo più preciso. Forse aggiungendo il logo nella parte superiore dell'attività, ecc. Cioè, ne ho bisogno. Non capisco, ci sono molti esempi e tutorial sulla personalizzazione di PreferenceActivity per le app pre-Android 3.0. È impossibile farlo funzionare per API SDK superiore a 10? – morphium

2

Ho provato questo codice per la mia applicazione

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory android:title="@string/PreferencesActivity.GeneralSettingsCategoryTitle"> 
     <Preference 
      android:title="yor title" 
      android:summary="your summary" 
      android:key="key to access preference" />  
     <Preference 
      android:title="@string/" 
      android:summary="@string/" 
      android:key="key2" /> 
     <PreferenceScreen 
      android:key="key3" 
      android:title="@string/" 
      android:summary="@string/"> 
      <CheckBoxPreference 
       android:title="@string/" 
       android:defaultValue="false" 
       android:summary="@string/" 
       android:key="key4" /> 
      <CheckBoxPreference 
       android:title="@string/" 
       android:defaultValue="true" 
       android:summary="@string/" 
       android:key="key5" /> 

      <ListPreference 
       android:title="@string/" 
       android:summary="@string/" 
       android:key="key6" 
       android:defaultValue="buttons" 
       android:entries="@array/" 
       android:entryValues="@array/" /> 
      .... 


       </prefefenceScreen> 
     </preferenceCategory> 
</preferenceScreen> 



enter code here 
5

Ho avuto lo stesso problema di te.

Ho provato un sacco di cose, ma qui è il mio codice completo:

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/MyPreferenceActivity.java

Il trucco è quello di aggiungere il setContentView nella sezione onBuildHeaders, ma non nel onCreate.

Ho anche effettuato alcuni test in frammento e non sono perfettamente sicuro del motivo per cui funziona, ma vi prometto: ho un layout personalizzato nella sezione di intestazione del tablet!

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/view/StockPreferenceFragment.java

+5

I collegamenti sono corretti – Dave

+0

il collegamento è rotto, ma sono stato in grado di trovarlo: https://github.com/iRail/BeTrains-for-Android/blob/master/BeTrains/src/main/java/tof/cv/ mpp/MyPreferenceActivity.java – Glaucus

+0

Tuttavia, non ho visto una chiamata a setContentView in onBuildHeaders. Quindi non sono sicuro di cosa pensare. – Glaucus

Problemi correlati