2011-10-21 88 views
16

我開發的應用程序具有的minSdkVersion =「11」,這是爲平板電腦和Android 4.0及更高版本的應用程序。我在這個話題上審查了互聯網,但沒有發現太多。android - 如何在Android 3.0中設置PreferenceActivity的自定義佈局?

要使用ListView控件實現對Android的SDK的早期版本中,我們只需要創建佈局(比如preference.xml)的自定義佈局和其ID等於android.R.id.list和使用的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> 

在Android 3.0的事情發生了變化,偏好和使用片段的實現。這是我preference_headers.xml文件看起來像:

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

     } 
    } 
} 

現在,如果我跑MyPreferenceActivity我會看到這個錯誤的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 

我知道是什麼原因導致此問題FragmentManager找不到插入片段GeneralSettingsFragment的視圖,但我不知道如何解決它。

順便說一句,如果我上運行的Android 4.0相同的應用程序,然後我可以看到標題的第一選擇活動。但是,如果我點擊通用,應用程序會崩潰,我會在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

你想做什麼?爲什麼你需要一個自定義佈局? – alexanderblom

+0

我想更精確地控制偏好活動。此外,我希望它儘可能與新版本的Android SDK兼容,那就是我需要擴展PreferenceActivity,但不能從頭開始實現它。 – morphium

回答

-1

你不需要setContenView。在這個例子中,佈局總體是通過標題和相關的片段完成的,另一個詞是自動完成的。

+0

我知道我不需要它。但在這個例子中,我將Button添加到列表頁腳。現在我想更精確地定製視圖。也許通過在活動頂部添加徽標等等,也就是說,我需要它。我只是不明白,有很多Pre-Android 3.0應用程序的PreferenceActivity自定義示例和教程。是否無法使API SDK大於10? – morphium

2

我嘗試此代碼爲我的應用程序

<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

我有同樣的問題比你。

我嘗試了很多東西,但這裏是我的全碼:

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

訣竅是添加的setContentView在onBuildHeaders部分,但不是在OnCreate。

我也做了一些片段測試和不完全知道爲什麼,這是工作,但我向你保證:我對平板電腦標題部分中的自定義佈局!

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

+5

鏈接被破壞 – Dave

+0

鏈接被破壞,但我能夠找到它:https://github.com/iRail/BeTrains-for-Android/blob/master/BeTrains/src/main/java/tof/cv/ mpp/MyPreferenceActivity.java – Glaucus

+0

但是,我沒有在onBuildHeaders中看到對setContentView的調用。所以不知道該怎麼想。 – Glaucus