简介

PreferenceFragment , 展示一系列的Preference条目并且当与用户有交互时,产生的值会自动保存到SharedPreferences中,通过PreferenceManager#getDefaultSharedPreferences(android.content.Context)可以查看对应的SharedPreferences的值。展示的Preferences的风格会随着系统而改变,通过XML文件可以快速的创建Preferences,官方推荐使用Fragment来实现这类功能。

创建XML

Tag 意义
PreferenceScreen 必须作为根节点,代表整个Preferences屏幕
PreferenceCategory 一组Preferences,便于分类
SwitchPreference 两种状态的preference,开关
ListPreference 列表显示Preference, android:entries设置的内容是我们在设置时看到的内容,而android:entryValues就是保存在preferences.xml中的值
CheckBoxPreference 复选框Preference,勾选和不勾选
RingtonePreference Ringtone选择Preference
EditTextPreference 编辑类Preference
MultiSelectListPreference 多选类Preference

常用属性

属性 用法
android:title 标题
android:defaultValue 默认值
android:key SharedPreference中保存值时使用的Key值
android:entries 列表或者多选框的显示内容
android:entryValues 列表或者多选框保存过程中对应的值

代码使用

XML文件

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="无线和网络">
        <SwitchPreference
            android:defaultValue="false"
            android:title="WLAN"
            android:key="switch_preference_wlan" />
        <SwitchPreference
            android:defaultValue="false"
            android:title="蓝牙"
            android:key="switch_preference_bluetooth" />
        <ListPreference
            android:defaultValue="1"
            android:title="休眠"
            android:entries="@array/pref_sleep_interval"
            android:entryValues="@array/pref_sleep_interval"
            android:key="list_preference_sleep" />
    </PreferenceCategory>
    <PreferenceCategory android:title="设备"
        android:persistent="false"
        android:orderingFromXml="false">
        <CheckBoxPreference
            android:defaultValue="false"
            android:title="静音"
            android:key="check_box_preference_virate" />
        <RingtonePreference
            android:defaultValue=""
            android:title="铃声"
            android:key="ringtone_preference_ringtone" />
    </PreferenceCategory>
    <PreferenceCategory android:title="隐私和安全">
        <EditTextPreference
            android:defaultValue="Default value"
            android:selectAllOnFocus="true"
            android:singleLine="true"
            android:title="设备名称"
            android:key="edit_text_preference_devicename" />
        <MultiSelectListPreference
            android:title="辅助功能"
            android:defaultValue="@array/pref_assit_function"
            android:entries="@array/pref_assit_function"
            android:entryValues="@array/pref_assit_function"
            android:key="multi_select_list_preference_assit" />
    </PreferenceCategory>
</PreferenceScreen>

arrays.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="pref_sleep_interval">
        <item>30秒</item>
        <item>1分钟</item>
        <item>2分钟</item>
        <item>5分钟</item>
        <item>10分钟</item>
        <item>30分钟</item>
    </array>

    <array name="pref_assit_function">
        <item>灵犀一指</item>
        <item>指关节截屏</item>
        <item>通话录音</item>
        <item>白科技</item>
        <item>黑科技</item>
    </array>
</resources>

自定义PreferenceFragment

PreferenceFragment是抽象类,需要自己实现

public class BaseFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        Toast.makeText(getActivity(), preference.toString() + " is Clicked", Toast.LENGTH_LONG).show();
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }
}

Activity中使用

BaseFragment baseFragment = new BaseFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(xxxxxx,baseFragment);
transaction.commit();

结果

这里写图片描述

SharedPreference结果<中文乱码是系统问题>
这里写图片描述

results matching ""

    No results matching ""