文章目录
- PreferenceFragment简介
- PreferenceFragment使用
- PreferenceFragment 扩展
PreferenceFragment简介
在我们写一个项目的时候,基本都有选项设置界面,这类设置界面的原理基本都是本地的一些个性化设置,通过读取本地设置来改变某些差异显示(例如字体大小,主题颜色,WIFI自动下载等)。这些设置一般都会使用Preference来保存,Android专门为这种Activity提供了便捷的基类PreferenceActivity(如果是Fragment,使用PreferenceFragment,现在推荐使用v7包下的PreferenceFragmentCompat),这些类内部封装了Preference,会帮我们自动读写设置,方便开发者便捷完成这类功能。
PreferenceFragment使用
PreferenceFragment位于android.preference包下,现在推荐使用v7包下的,这里还是使用这个来说明,原理是一样的。

先来使用下:
- 在res目录下创建xml目录

- 在xml目录下创建xml文件(文件名自己定义即可)
这里演示的文件是pref_setting.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><CheckBoxPreferenceandroid:defaultValue="false"android:key="setting_no_img"android:summary="仅在WIFI环境下显示图片"android:title="无图模式" /><PreferenceCategory android:title="设置"><EditTextPreferenceandroid:hint="设置用户名"android:key="setting_name"android:title="设置用户名" /><Preferenceandroid:key="setting_font_size"android:summary="设置字体大小"android:title="设置字体大小" /></PreferenceCategory><SwitchPreferenceandroid:defaultValue="false"android:key="setting_switch"android:title="设置模式-Switch" /><RingtonePreferenceandroid:key="setting_ring"android:title="设置模式-Ringtone" />
</PreferenceScreen>
- 继承PreferenceFragment,在onCreate方法中调用
addPreferencesFromResource方法加载xml目录下的资源即可
public class PreferenceTestFragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.pref_setting);//加载xml文件}
}
运行效果:

pref_setting.xml中使用的控件可以查看android.preference包下,这里面有几个常用的属性:
| 属性名 | 用途 |
|---|---|
| android:key | 存储key,这个就是SharedPreferences存储时的key |
| android:title | 标题 |
| android:defaultValue | 默认值 |
设置点击事件
findPreference("setting_no_img").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {//todoreturn true;}});
findPreference中的key就是xml中声明的key。
可以使用registerOnSharedPreferenceChangeListener来监听SharedPreferences值改变。
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
PreferenceFragment 扩展
可以通过继承Preference来实现自定义控件
public class ThemePreference extends Preference {private CircleView circleImageView;public ThemePreference(Context context, AttributeSet attrs) {super(context, attrs);// 加载布局文件setWidgetLayoutResource(R.layout.item_theme_preference_preview);}// 绑定视图@Overrideprotected void onBindView(View view) {super.onBindView(view);int color = CommonSettingUtil.getInstance().getThemeColor();circleImageView = (CircleView) view.findViewById(R.id.iv_preview);circleImageView.setBackgroundColor(color);}/*** 刷新颜色显示*/public void updateColor() {circleImageView.setBackgroundColor(CommonSettingUtil.getInstance().getThemeColor());}
}















