PreferenceFragment的使用

PreferenceFragment简介

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

PreferenceFragment使用

PreferenceFragment位于android.preference包下,现在推荐使用v7包下的,这里还是使用这个来说明,原理是一样的。
包
先来使用下:

  1. 在res目录下创建xml目录
    创建xml目录
  2. 在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>
  •  
  •  
  1. 继承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);

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);
    }

	// 绑定视图
    @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子类

 
  1. package com.yuncai.menjin.transition;

  2.  
  3. import android.os.Bundle;

  4. import android.preference.Preference;

  5. import android.preference.PreferenceFragment;

  6. import android.support.annotation.Nullable;

  7. import android.util.Log;

  8.  
  9. /**

  10. * Function:

  11. * Created by TianMing.Xiong on 18-10-25.

  12. */

  13.  
  14. public class NavigationSummary extends PreferenceFragment implements Preference.OnPreferenceChangeListener{

  15.  
  16. public static NavigationSummary newInstance() {

  17. return new NavigationSummary();

  18. }

  19.  
  20. @Override

  21. public void onCreate(@Nullable Bundle savedInstanceState) {

  22. super.onCreate(savedInstanceState);

  23. // xml文件夹下的一个xx_preference.xml中一个<PreferenceScreen/>标签对应一个PreferenceFragment

  24. addPreferencesFromResource(R.xml.preferences);

  25.  
  26. // 获取级别描述(组)

  27. Preference set_navigation = getPreferenceManager().findPreference("set_navigation");

  28. CharSequence summary = set_navigation.getSummary();

  29. CharSequence title = set_navigation.getTitle();

  30. Log.e("TAG","summary:"+summary+",title:"+title);

  31. // 监听开关按钮

  32. Preference navigation_is_show_and_hide = getPreferenceManager().findPreference("navigation_is_show_and_hide");

  33. // 用于监听哪个Preference的回调,用key标识

  34. navigation_is_show_and_hide.setOnPreferenceChangeListener(this);

  35. }

  36.  
  37. /**

  38. * 必须返回true,否则newValue值永远是false

  39. * @param preference

  40. * @param newValue

  41. * @return

  42. */

  43. @Override

  44. public boolean onPreferenceChange(Preference preference, Object newValue) {

  45. String key = preference.getKey();

  46. Log.e("TAG","key:"+key+",value:"+newValue);

  47. return true;

  48. }

  49. }

  50. // 输出:

  51. // 01-03 18:30:16.160 3450-3450/com.yuncai.menjin.transition E/TAG: summary:用于导航栏设置,title:导航栏设置

  52. // 01-03 18:30:24.720 3450-3450/com.yuncai.menjin.transition E/TAG: key:navigation_is_show_and_hide,value:false

  53. // 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

 
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

  3. <!-- 设置的类别 -->

  4. <PreferenceCategory

  5. android:key="set_navigation"

  6. android:summary="用于导航栏设置"

  7. android:title="导航栏设置">

  8. <CheckBoxPreference

  9. android:key="navigation_is_show_and_hide"

  10. android:summary="使设备底部导航栏不可见"

  11. android:defaultValue="false"

  12. android:title="隐藏导航栏"/>

  13. </PreferenceCategory>

  14. </PreferenceScreen>

c.在fragment中绑定

即之前fragment中的代码

addPreferencesFromResource(R.xml.preferences);

3.效果图

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值