你如何在Android上创build首选项活动和偏好片段?

当我正在关注一个老的教程( Créezdes应用程序灌输Android – > openclassroom )时,我被卡在PreferenceActivity类的这个弃用的方法addPreferencesFromResource(int id)

所以我的问题是:

在Android中创build首选项的新方法是什么?

我发现这个post( 什么使用,而不是“PreferenceActivity中的”addPreferencesFromResource“ ),这有助于我明白,你必须通过PreferenceFragment来做到这一点。

在下面的解释中,我使用your.package. 只是为了表明你必须把包名称。 每个人都有自己的包装,所以请把它换成你的包装。

让我们开始 :


1.首选片段

  • 创build您的PreferenceFragment类

    MyPreferenceFragment

     public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.fragment_preference); } } 

  • 然后关联xml资源

    fragment_preference.xml (在项目的res / xml文件夹中)

     <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="FOO"> <CheckBoxPreference android:key="checkBoxPref" android:title="check it out" android:summary="click this little box"/> </PreferenceCategory> </PreferenceScreen> 

    这就是Fragment一部分。


2.偏好活动

  • 创buildPreferenceActivity类

    MyPreferenceActivity

     public class MyPreferenceActivity extends PreferenceActivity { @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.headers_preference, target); } @Override protected boolean isValidFragment(String fragmentName) { return MyPreferenceFragment.class.getName().equals(fragmentName); } } 

    不要忘记重写isValidFragment(String fragmentName)方法,因为您的应用程序将会在您的面孔中打孔! ;)更严重的是,我不知道为什么你需要这样做,但它是必要的。 如果有人对此有一个解释,我很乐意阅读它:)

    编辑:


    感谢kirtan403我现在知道为什么它需要:它必须设置,因为( Android框架片段注入 )。


    正如你可以在onBuildHeaders(List<Header> target)看到的那样,我们加载另一个包含首选项文件的xml文件。 简而言之,标题是偏好的左边部分,片段是正确的部分(对于平板电脑)。 对于电话,您将首先拥有标题,当您点击某个项目时,相应的片段将放在标题列表的顶部。

    阅读这篇文章( 带有片段的Android中的多窗格开发 – 教程 ),这些图像会自己解释。

  • 然后关联xml资源

    headers_preference.xml (在项目的res / xml文件夹中)

     <?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="your.package.MyPreferenceFragment" android:title="Goto: Preference fragment" android:summary="An example of some preferences." /> </preference-headers> 

    正如你可能已经注意到的标题部分,你有:

    android:fragment="your.package.MyPreferenceFragment"

    这将作为您要显示的片段的链接。 在平板电脑上,它将加载在正确的部分,在电话上,它将加载在当前视图之上。


3. Android Manifest

现在你应该做的是把你的Activity添加到AndroidManifest.xml文件中。

application部分添加这些行:

 <activity android:name="your.package.MyPreferenceActivity" android:label="Preferences"> </activity> 

你可能会告诉我:

“哦,亲爱的,你忘了把你的行为android:launchMode =”singleTask

不要把这个,因为你永远不会加载你的手机片段。 这个错误是由一个伟大的人解决的! 这是他的博客链接( 小屏幕/手机上的Android头部偏好设置 )。


4.从菜单启动首选项

最后你需要添加显示这个偏好的能力! 要做到这一点,你需要3件事情:

  • 菜单

    menu.xml (在项目的文件夹res /菜单中)

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/preferences" android:title="Preferences" /> </menu> 

  • onCreateOptionsMenu(Menu menu)方法下,在主要活动(不是PreferenceActivity)中加载此菜单

     @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } 

  • 单击该button时启动MyPreferenceActivity活动。

    为此,您将需要重写主活动中的onOptionsItemSelected(MenuItem item)方法。

     @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.preferences: { Intent intent = new Intent(); intent.setClassName(this, "your.package.MyPreferenceActivity"); startActivity(intent); return true; } } return super.onOptionsItemSelected(item); } 


Et voila les amis!

我没有testing过这个代码。 我拿了它,并从我自己的代码中修改它,所以我可能没有很好地复制粘贴的东西。 如果你遇到错误告诉我,我会尝试找出问题并解决这个问题。

我希望这篇文章能够帮助那些在外面的人:D

干杯!

我喜欢这个post的解决scheme: http : //alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

..因为它似乎是最紧凑的人,只需要一些非常基础的东西,并迅速运行。 它只有一个.java文件和两个小的xml文件。

活动configuration提醒

将3个文件添加到您的项目后,不要忘记

A)添加Prefs活动到清单文件
B)添加一些方法来启动Prefs活动。例如,一个button或菜单项

将以下文件添加到您的项目。 使用它们列出的顺序来避免编译错误。

  1. 添加/res/values/array.xml

     <resources> <string-array name="listArray"> <item>Ace</item> <item>Club</item> </string-array> <string-array name="listValues"> <item>Ace</item> <item>Club</item> </string-array> </resources> 
  2. 添加/res/xml/preferences.xml

     <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:title="Your Name" android:key="username" android:summary="Please provide your username"></EditTextPreference> <CheckBoxPreference android:title="Application Updates" android:defaultValue="false" android:summary="This option if selected will allow the application to check for latest versions." android:key="applicationUpdates" /> <ListPreference android:title="Download Details" android:summary="Select the kind of data that you would like to download" android:key="downloadType" android:defaultValue="Ace" android:entries="@array/listArray" android:entryValues="@array/listValues" /> </PreferenceScreen> 
  3. 添加活动代码

     public class AppPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); checkValues(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } private void checkValues() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String strUserName = sharedPrefs.getString("username", "NA"); boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false); String downloadType = sharedPrefs.getString("downloadType","1"); String msg = "Cur Values: "; msg += "\n userName = " + strUserName; msg += "\n bAppUpdates = " + bAppUpdates; msg += "\n downloadType = " + downloadType; Toaster.shortDebug(msg); } }