2011-10-21 19 views
16

Rozwijam aplikację z minSdkVersion = "11", czyli aplikacją na tablety i Androida 4.0 oraz nowszymi. Przeglądałem internet na ten temat, ale nie znalazłem zbyt wiele.android - Jak ustawić niestandardowy układ PreferenceActivity w systemie Android 3.0?

Aby zaimplementować niestandardowy układ dla poprzednich wersji Androida SDK, musimy po prostu stworzyć layout (powiedzmy preference.xml) z ListView, a jego id jest równy Android.R.id.list i użyć metody 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> 

W Androidzie 3.0 wiele się zmieniło i preferencje są realizowane z wykorzystaniem fragmentów. To jest jak mój plik preference_headers.xml wygląda następująco:

<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); 

     } 
    } 
} 

Teraz jeśli biegnę MyPreferenceActivity ujrzę tego błędu w 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 wiesz, co powoduje ten problem. FragmentManager po prostu nie może znaleźć widoku do wstawienia fragmentu GeneralSettingsFragment w. Ale nie wiem jak go rozwiązać.

Nawiasem mówiąc, jeśli uruchomię tę samą aplikację na Androida 4.0, to widzę pierwszą aktywność preferencji z nagłówkami. Ale jeśli kliknę przycisk Ogólne, aplikacja zawiesi się, a otrzymam podobny komunikat o błędzie:

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

Co próbujesz zrobić? Dlaczego potrzebujesz niestandardowego układu? – alexanderblom

+0

Chcę mieć dokładniejszą kontrolę nad działaniem preferencji. Poza tym chcę, aby był on kompatybilny z nowszymi wersjami Androida SDK w jak największym stopniu, tj. Muszę rozszerzyć PreferenceActivity, ale nie wdrażać go samodzielnie od zera. – morphium

Odpowiedz

-1

Nie trzeba ustawiaćContContView. w tym przykładowym przypadku populacja układu jest wykonywana poprzez nagłówki i powiązane fragmenty, inne słowa automatycznie.

+0

Wiem, że nie potrzebuję tego. Ale w tym przykładzie dodałem przycisk do stopki List. Teraz chcę bardziej precyzyjnie dostosować widok. Może dodając logo w górnej części Aktywności itp. To znaczy, potrzebuję tego. Po prostu nie rozumiem, istnieje wiele przykładów i samouczków dotyczących dostosowywania PreferenceActivity dla aplikacji przed Androidem 3.0. Czy nie jest możliwe, aby działało na API SDK większe niż 10? – morphium

2

Próbowałem ten kod do mojego wniosku

<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

miałem ten sam problem, niż ty.

próbowałem wiele rzeczy, ale tutaj jest moje pełny kod:

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

Sztuką jest dodanie setContentView w sekcji onBuildHeaders, ale nie w onCreate.

Wykonałem również kilka testów w części i nie jestem do końca pewien, dlaczego to działa, ale obiecuję: mam niestandardowy układ w sekcji nagłówka tabletu!

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

+5

Linki są zerwane – Dave

+0

link jest uszkodzony, ale udało mi się go znaleźć: https://github.com/iRail/BeTrains-for-Android/blob/master/BeTrains/src/main/java/tof/cv/ mpp/MyPreferenceActivity.java – Glaucus

+0

Jednak nie widziałem połączenia do setContentView w onBuildHeaders. Więc nie wiem, co myśleć. – Glaucus

Powiązane problemy