你如何在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或菜单项
将以下文件添加到您的项目。 使用它们列出的顺序来避免编译错误。
-
添加/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>
-
添加/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>
-
添加活动代码
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); } }