在进行Android开发的过程中,有时需要实现一个设置界面,就像下面的系统的显示设置。这样的界面自己实现起来略显繁琐,好在Android中已经实现了这样的设置界面,那就是PreferenceActivity。并且PreferenceActivity还有一个莫大的好处,配置信息会自动使用SharedPreferences进行保存,无需我们自己实现。

将PreferenceActivity和PreferenceFragment结合使用,其中PreferenceActivity只是负责加载选项设置列表的布局文件。
1、现在res目录下新建xml目录,建立preference_home.xml文件
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"><headerandroid:fragment="com.sunny.handlertest.MyPreferenceActivity$Prefs1Fragment"android:icon="@mipmap/ic_launcher"android:summary="设置第一个参数"android:title="设置1" /><headerandroid:fragment="com.sunny.handlertest.MyPreferenceActivity$Pref2Fragment"android:icon="@mipmap/ic_launcher"android:summary="设置第二个参数"android:title="设置2" /><headerandroid:icon="@mipmap/ic_launcher"android:summary="view baidu website"android:title="baidu"><intentandroid:action="android.intent.action.VIEW"android:data="https://m.baidu.com/" /></header></preference-headers>
每一项header设置点击后的fragment路径,标题,图标等。
并且可以加入intent,如第三个header,点击以后会打开百度的网站。
2、MyPreferenceActivity并继承PreferenceActivity
public class MyPreferenceActivity extends PreferenceActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (hasHeaders()) {Button button = new Button(this);button.setText("Exit");setListFooter(button);}}@Overrideprotected boolean isValidFragment(String fragmentName) {System.out.println(fragmentName);return true;}@Overridepublic void onBuildHeaders(List<Header> target) {loadHeadersFromResource(R.xml.preference_home, target);}public static class Prefs1Fragment extends PreferenceFragment {}public static class Pref2Fragment extends PreferenceFragment {}}
在onCreate中,我们可以利用setListFooter()给界面设置一个底部按钮之类的东西。
要想加载配置文件,需要重写onBuildHeaders()方法,并使用loadHeadersFromResource(R.xml.preference_home, target)来加载我们的配置文件。
需要注意的是,在Android 4.4及以上的的版本中,还要实现isValidFragment()方法,否则会有运行时错误,这个回调函数,会传递给我们fragment类的路径,我们要判断是否是有效路径,如果是,就返回true。在这里为了简单,直接返回true。

3、创建preference_frag1.xml
<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><PreferenceCategory android:title="设置组1"><EditTextPreferenceandroid:dialogTitle="输入您的名字"android:key="name"android:singleLine="true"android:summary="设置您的姓名"android:title="姓名" /><ListPreferenceandroid:dialogTitle="选择性别"android:entries="@array/sex_name"android:entryValues="@array/sex_value"android:key="sex"android:summary="选择您的性别"android:title="性别" /></PreferenceCategory><PreferenceCategory android:title="设置组2"><CheckBoxPreferenceandroid:defaultValue="true"android:key="isOk"android:summaryOff="关闭"android:summaryOn="打开"android:title="推送" /><SwitchPreferenceandroid:defaultValue="false"android:key="autoRun"android:summaryOff="关"android:summaryOn="开"android:title="自启动" /></PreferenceCategory></PreferenceScreen>
需要注意如下几点,每一项要设置一个key,这是每一个设置的键,在代码中,可以通过这个键找到对应的Preference。ListPreference要配置entries和entryValues这两个属性,是数组类型,分别代表显示出来的选项和存储的值
string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="sex_name"><item>男</item><item>女</item></string-array><string-array name="sex_value"><item>1</item><item>0</item></string-array>
</resources>
PreferenceCategory用于设置分组;EditTextPreference是含有EditText的对话框;ListPreference是含有单选列表的对话框;CheckBoxPreference是单选项;SwitchPreference是开关。
我在在Prefs1Fragment的onCreate方法中使用addPreferencesFromResource(R.xml.preference_frag1)就可以载入我们的配置文件啦。通过findPreference()方法,还可以找到key对应的配置
public static class Prefs1Fragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.preference_frag1);String name = ((EditTextPreference) findPreference("name")).getText();Toast.makeText(getActivity(), name, Toast.LENGTH_SHORT).show();}}
展示效果:

小小demo,更加熟练地使用PreferenceFragment,弄了一早上!
参考地址:https://www.jianshu.com/p/6b8999ecd47b









