AndroidStudio-3.2.1(十三)SharedPreferences与PreferenceFragment

本篇介绍SharedPreferences的相关用法

SharedPreferences是android提供的一个轻型存储框架,以key-value的方式存取一些系统配置项,不宜存取大数据量。

SharedPreferences的存取

SharedPreferences preferences = getPreferences(Activity.MODE_PRIVATE);//获取程序选项集
SharedPreferences.Editor edit = preferences.edit();//获取编辑Editor 
edit.putString("key","value");//加入键值对
edit.apply();//提交
preferences.getString("key","默认值");//读取

说明:
1、获取SharedPreferences 还有另一种方式 getSharedPreferences(String name, int mode)。适合程序较大配置项较多,不同的配置项可根据存取频率、业务类别等进行分两类,通过指定name来分类管理配置项。
2、存储键值对的时候,获取一次Editor ,编辑完后提交一次apply()即可。不要多次获取edit、多次提交。
3、Editor 提交还有另一种方式edit.commit()。区别在于commit直接提交到数据库里,而apply是异步提交,先存到内存里,然后再提交数据库。一般情况使用apply().

PreferenceFragment

开发应用程序时经常用到选项配置界面,android为我们提供了基类PreferenceFragment,通过继承该类的Activity和一个xml布局文件来实现选项界面。Android 3.0之前用的是PreferenceActivity,现在已不建议使用。
PreferenceFragment中构建的配置项,会自动存储到SharedPreferences中,提供我们读取使用。
在这里插入图片描述
下面演示如何构建一个选项界面:
1、添加类并修改继承类。

public class PrefFragment extends PreferenceFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.mypref);
    }
}

2、上面代码用到了一个xml文件,是选项界面的布局界面。在res文件夹下添加xml文件夹,然后添加mypref.xml.注意要选择PreferenceScreen类型。
在这里插入图片描述
3、编辑mypref.xml,进入Desgin界面,可以看到常用的选项类型。比较常用的有PreferenceCategory(分组)、CheckBoxPreference、ListPreference、SwitchPreference等。具体看代码示例:
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
   <EditTextPreference 
            android:key="myname"
            android:title="请输入真实姓名"
            android:summary="姓名"/>    
    <CheckBoxPreference
        android:defaultValue="false"
        android:key="check_box_preference_1"
        android:title="是否玩过"
        android:summaryOn="选了是"
        android:summaryOff="选了否"/>
    <SwitchPreference
        android:defaultValue="false"
        android:key="switch_preference_1"
        android:title="选择性别"
        android:summaryOn="你是男的"
        android:summaryOff="你是女的"
        android:switchTextOn="男"
        android:switchTextOff="女"/>
    <ListPreference
        android:defaultValue="1"
        android:entries="@array/roles"
        android:entryValues="@array/roles"
        android:key="listpreference_1"
        android:title="选择角色"
        android:summary="选择在游戏中的角色"/>
</PreferenceScreen>

对应的界面如下:
在这里插入图片描述
当然布局xml文件还可以更复杂,比如一个PreferenceScreen内多个PreferenceCategory ,甚至多个PreferenceScreen。

4、说明一下ListPreference的entries和entryValues两个属性。这是两个字符串集合,分别对应界面上显示的值(entries)和存储值(entryValues),当然这两个值可以相同。
当你在Design界面上拖一个ListPreference时,会先后弹出两个界面让你选择entries和entryValues。当然事先没有的话,也可以选择“Add new resource”。它会默认把字符串常量存到/res/values/arrays.xml文件中。

在这里插入图片描述
Add new resource之后,需要到arrays.xml里添加具体的item。

<resources>
    <string-array name="roles">
        <item>八神</item>
        <item>草薙</item>
        <item>K</item>
        <item>ASH</item>
    </string-array>
    <string-array name="weapon">
        <item></item>
        <item></item>
        <item></item>
        <item></item></string-array>
</resources>

5、最后一步,就是在MainActivity里启动这个界面,关于Fragment的具体用法,可另见。

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        PrefFragment prefFragment = new PrefFragment();
        transaction.add(R.id.container, prefFragment);
        transaction.commit();

6、上面界面中配置的项都可以读取出来。

        SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        boolean chkvalue = defaultSharedPreferences.getBoolean("check_box_preference_1", false);
        String role = defaultSharedPreferences.getString("listpreference_1", "");

7、监听事件onPreferenceTreeClick()方法。当一个选项的状态影响其他选项的状态时,我们需要通过选项的点击事件来控制。在PrefFragment中添加代码,让listPreference的可用性与checkBoxPreference的状态保持一致。

扫描二维码关注公众号,回复: 5672772 查看本文章
 @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        if ("check_box_preference_1".equals(preference.getKey())) {
            CheckBoxPreference checkBoxPreference = (CheckBoxPreference) findPreference("check_box_preference_1");
            ListPreference listPreference = (ListPreference) findPreference("listpreference_1");
            //让listPreference和checkBoxPreference的状态保持一致
            listPreference.setEnabled(checkBoxPreference.isChecked());
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

猜你喜欢

转载自blog.csdn.net/SHENCHEN1987/article/details/88826512