前言
我们在进行Android开发的过程中,有时需要实现一个设置界面,就像下面的系统的显示设置。这样的界面自己实现起来略显繁琐,好在Android中已经实现了这样的设置界面,那就是PreferenceActivity
。并且PreferenceActivity
还有一个莫大的好处,配置信息会自动使用SharedPreferences
进行保存,无需我们自己实现。
使用方法
如果我们有许多类设置项,我们可以把设置分页。将PreferenceActivity
和PreferenceFragment
结合使用,其中PreferenceActivity
只是负责加载选项设置列表的布局文件。
- 配置选项设置列表
选项设置列表需要通过xml
文件进行配置,现在res
目录下新建xml
目录,建立preference_home.xml
文件。使用preference-headers
作为根节点,配置内容为<?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="com.sunny.handlertest.MyPreferenceActivity$Prefs1Fragment" android:icon="@mipmap/ic_launcher" android:summary="设置第一个参数" android:title="设置1" /> <header android:fragment="com.sunny.handlertest.MyPreferenceActivity$Pref2Fragment" android:icon="@mipmap/ic_launcher" android:summary="设置第二个参数" android:title="设置2" /> <header android:icon="@mipmap/ic_launcher" android:summary="view baidu website" android:title="baidu"> <intent android:action="android.intent.action.VIEW" android:data="https://m.baidu.com/" /> </header> </preference-headers>
我们为每一项header
设置点击后的fragment
路径,标题,图标等。并且可以加入intent
,如第三个header
,点击以后会打开百度的网站。
下面来编写代码,新建一个类MyPreferenceActivity
并继承PreferenceActivity
。实现两个静态内部类,继承PreferenceFragment
。
在onCreate
中,我们可以利用setListFooter()
给界面设置一个底部按钮之类的东西。
要想加载配置文件,需要重写onBuildHeaders()
方法,并使用loadHeadersFromResource(R.xml.preference_home, target)
来加载我们的配置文件。
需要注意的是,在Android 4.4
及以上的的版本中,还要实现isValidFragment()
方法,否则会有运行时错误,这个回调函数,会传递给我们fragment
类的路径,我们要判断是否是有效路径,如果是,就返回true
。在这里为了简单,直接返回true
。
public class MyPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (hasHeaders()) {
Button button = new Button(this);
button.setText("Exit");
setListFooter(button);
}
}
@Override
protected boolean isValidFragment(String fragmentName) {
System.out.println(fragmentName);
return true;
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_home, target);
}
public static class Prefs1Fragment extends PreferenceFragment {
}
public static class Pref2Fragment extends PreferenceFragment {
}
}
这一步实现的效果如图
- 配置详细设置
新建一个配置文件preference_frag1.xml
,设置根节点为PreferenceScreen
,代码如下
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="设置组1">
<EditTextPreference
android:dialogTitle="输入您的名字"
android:key="name"
android:singleLine="true"
android:summary="设置您的姓名"
android:title="姓名" />
<ListPreference
android:dialogTitle="选择性别"
android:entries="@array/sex_name"
android:entryValues="@array/sex_value"
android:key="sex"
android:summary="选择您的性别"
android:title="性别" />
</PreferenceCategory>
<PreferenceCategory android:title="设置组2">
<CheckBoxPreference
android:defaultValue="true"
android:key="isOk"
android:summaryOff="关闭"
android:summaryOn="打开"
android:title="推送" />
<SwitchPreference
android:defaultValue="false"
android:key="autoRun"
android:summaryOff="关"
android:summaryOn="开"
android:title="自启动" />
</PreferenceCategory>
</PreferenceScreen>
其中PreferenceCategory
用于设置分组;EditTextPreference
是含有EditText
的对话框;ListPreference
是含有单选列表的对话框;CheckBoxPreference
是单选项;SwitchPreference
是开关。
需要注意如下几点,每一项要设置一个key
,这是每一个设置的键,在代码中,可以通过这个键找到对应的Preference
。ListPreference
要配置entries
和entryValues
这两个属性,是数组类型,分别代表显示出来的选项和存储的值,代码如下
<?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>
配置好后,我在在Prefs1Fragment
的onCreate
方法中使用addPreferencesFromResource(R.xml.preference_frag1)
就可以载入我们的配置文件啦。通过findPreference()
方法,还可以找到key对应的配置。完整代码如下
public static class Prefs1Fragment extends PreferenceFragment {
@Override
public 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();
}
}
效果如图所示
再说几句
这是写的第一篇读书笔记,以后还会慢慢更新的,努力学习ing
不早了,晚安~o( ̄▽ ̄)ブ**