在我们写一个项目的时候,基本都有选项设置界面,这类设置界面的原理基本都是本地的一些个性化设置,通过读取本地设置来改变某些差异显示(例如字体大小,主题颜色,WIFI自动下载等)。这些设置一般都会使用Preference来保存,Android专门为这种Activity提供了便捷的基类PreferenceActivity(如果是Fragment,使用PreferenceFragment,现在推荐使用v7包下的PreferenceFragmentCompat),这些类内部封装了Preference,会帮我们自动读写设置,方便开发者便捷完成这类功能。
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">
<CheckBoxPreference
android:defaultValue="false"
android:key="setting_no_img"
android:summary="仅在WIFI环境下显示图片"
android:title="无图模式" />
<PreferenceCategory android:title="设置">
<EditTextPreference
android:hint="设置用户名"
android:key="setting_name"
android:title="设置用户名" />
<Preference
android:key="setting_font_size"
android:summary="设置字体大小"
android:title="设置字体大小" />
</PreferenceCategory>
<SwitchPreference
android:defaultValue="false"
android:key="setting_switch"
android:title="设置模式-Switch" />
<RingtonePreference
android:key="setting_ring"
android:title="设置模式-Ringtone" />
</PreferenceScreen>
- 继承PreferenceFragment,在onCreate方法中调用
addPreferencesFromResource方法加载xml目录下的资源即可
public class PreferenceTestFragment extends PreferenceFragment {
@Override
public 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() {
@Override
public boolean onPreferenceClick(Preference preference) {
//todo
return true;
}
});
findPreference中的key就是xml中声明的key。
可以使用registerOnSharedPreferenceChangeListener来监听SharedPreferences值改变。
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
可以通过继承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);
}
// 绑定视图
@Override
protected 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());
}
}
简单使用示例
1.PreferenceFragment介绍
a.PreferenceFragment实际为Fragment的一个子类
b.创建一个PreferenceFragment需要绑定一个xml来显示视图
c.绑定后没就可以当作普通Fragment使用,只是每new一个实例就会创建一个SharePreference,把之前绑定的xml中的值写入保存(即运行时候,会自动在/data/data/<packagename>/shared_prefs/目录生成一个文本文件)。
2.使用步骤
a.创建一个PreferenceFragment子类
-
package com.yuncai.menjin.transition; -
import android.os.Bundle; -
import android.preference.Preference; -
import android.preference.PreferenceFragment; -
import android.support.annotation.Nullable; -
import android.util.Log; -
/** -
* Function: -
* Created by TianMing.Xiong on 18-10-25. -
*/ -
public class NavigationSummary extends PreferenceFragment implements Preference.OnPreferenceChangeListener{ -
public static NavigationSummary newInstance() { -
return new NavigationSummary(); -
} -
@Override -
public void onCreate(@Nullable Bundle savedInstanceState) { -
super.onCreate(savedInstanceState); -
// xml文件夹下的一个xx_preference.xml中一个<PreferenceScreen/>标签对应一个PreferenceFragment -
addPreferencesFromResource(R.xml.preferences); -
// 获取级别描述(组) -
Preference set_navigation = getPreferenceManager().findPreference("set_navigation"); -
CharSequence summary = set_navigation.getSummary(); -
CharSequence title = set_navigation.getTitle(); -
Log.e("TAG","summary:"+summary+",title:"+title); -
// 监听开关按钮 -
Preference navigation_is_show_and_hide = getPreferenceManager().findPreference("navigation_is_show_and_hide"); -
// 用于监听哪个Preference的回调,用key标识 -
navigation_is_show_and_hide.setOnPreferenceChangeListener(this); -
} -
/** -
* 必须返回true,否则newValue值永远是false -
* @param preference -
* @param newValue -
* @return -
*/ -
@Override -
public boolean onPreferenceChange(Preference preference, Object newValue) { -
String key = preference.getKey(); -
Log.e("TAG","key:"+key+",value:"+newValue); -
return true; -
} -
} -
// 输出: -
// 01-03 18:30:16.160 3450-3450/com.yuncai.menjin.transition E/TAG: summary:用于导航栏设置,title:导航栏设置 -
// 01-03 18:30:24.720 3450-3450/com.yuncai.menjin.transition E/TAG: key:navigation_is_show_and_hide,value:false -
// 01-03 18:30:26.130 3450-3450/com.yuncai.menjin.transition E/TAG: key:navigation_is_show_and_hide,value:true
b.在res文件夹下创建一个xml文件夹,新建一个以<PreferenceScreen>为根节点的xml文件preferences.xml
-
<?xml version="1.0" encoding="utf-8"?> -
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> -
<!-- 设置的类别 --> -
<PreferenceCategory -
android:key="set_navigation" -
android:summary="用于导航栏设置" -
android:title="导航栏设置"> -
<CheckBoxPreference -
android:key="navigation_is_show_and_hide" -
android:summary="使设备底部导航栏不可见" -
android:defaultValue="false" -
android:title="隐藏导航栏"/> -
</PreferenceCategory> -
</PreferenceScreen>
c.在fragment中绑定
即之前fragment中的代码
addPreferencesFromResource(R.xml.preferences);
3.效果图

本文介绍了Android中PreferenceFragment的使用方法及自定义控件技巧。PreferenceFragment是Android提供的用于快速搭建设置界面的组件,通过加载XML配置文件可以轻松实现个性化设置功能。

562

被折叠的 条评论
为什么被折叠?



