如何在Android 3.0中设置PreferenceActivity的自定义布局?

我正在开发与minSdkVersion =“11”的应用程序,这是平板电脑和Android 4.0和更新的应用程序。 我在这个话题上审视了互联网,但没有发现太多。

为了实现以前版本Android SDK的自定义布局,我们只需要使用ListView创build布局(比如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只是无法find一个视图插入片段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) 

Solutions Collecting From Web of "如何在Android 3.0中设置PreferenceActivity的自定义布局?"

我有和你一样的问题。

我尝试了很多东西,但是这里是我的完整代码:

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

窍门是在onBuildHeaders部分添加setContentView,但不在onCreate中。

我也做了一些片段testing,并不完全确定为什么这是工作,但我保证:我有一个平板电脑头部分的自定义布局!

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

我为我的应用程序尝试了这个代码

 <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 

你不需要setContenView。 在这个例子中,布局总体是通过标题和相关的片段完成的,另外一个词是自动完成的。