当前位置:   article > 正文

SharedPreferences安卓共享偏好设置,安卓数据本地存储

SharedPreferences安卓共享偏好设置,安卓数据本地存储

一、获取SharedPreferences实例

1.1、指定名称的SharedPreferences

Context.getSharedPreferences(String name, int mode)

由于Activity中已经存在Context的实例,所以在Activity中可以直接通过getSharedPreferences(String, int)获取SharedPreferences的实例

参数说明

name:SharedPreferences存储的文件名,如果name不存在,则会在Editor.commit()后创建

mode:创建模式,值为0或者其他的值,我们一般填0应用内访问就可以了,详情查看

1.2、获取默认的SharedPreferences

PreferenceManager.getDefaultSharedPreferences(Context context)

我这里用的是android.support.v7.preference库,使用的时候需要在App gradle中配置dependencies

如下图所示

 代码如下

implementation 'com.android.support:preference-v7:28.0.0'

二、编辑和删除数据

2.1、获取编辑器

SharedPreferences.edit(),获取SharedPreferences.Editor的实例

2.2、赋值

字符串赋值:putString(String key, String value)

2.3、标记删除所有数据

clear()

2.3、提交

提交有一下两种方式,修改数据完成后需要执行提交的方法才会完成修改

(1)、apply()

(2)、commit()

SharedPreferences.Editor更多的使用方法参考链接

三、查看数据

查看数据是基于SharedPreferences的实例进行操作

如:getString(String key, String defValue)

更多查看方式链接

四、静态资源引用

4.1、字符串静态资源引用

这里用到的key字符串与及其它字符串默认值建议使用引用静态资源的方式赋值,详情参考链接

注意,在使用静态资源赋值到key时,需要设置translatable属性为false,防止国际化等其它原因导致key值被转换,设置如下所示:

<string name="pref_size_key" translatable="false">size</string>

4.2、布尔值静态资源引用

布尔类型的默认值建议也是用资源引用的方式赋值,详情参考链接

五、监听SharedPreferences的数据被修改

5.1、实现接口

在需要监听的类里面实现SharedPreferences.OnSharedPreferenceChangeListener接口

比如在Activity中实现接口SharedPreferences.OnSharedPreferenceChangeListener,实现接口的方法onSharedPreferenceChanged

比如下面的实现代码:

  1. @Override
  2. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
  3. if (key.equals(“signature”)) {
  4. Log.i(TAG, “Preference value was updated to: “ + sharedPreferences.getString(key, ""));
  5. }
  6. }

5.2、注册监听

通过SharedPreferences的registerOnSharedPreferenceChangeListener方法注册一个监听器

  1. @Override
  2. public void onResume() {
  3. super.onResume();
  4. getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
  5. }

5.3、取消监听

如果注册了监听,则需要在退出的时候取消注册监听:

  1. @Override
  2. public void onPause() {
  3. super.onPause();
  4. getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
  5. }

需要注意的是,我前面注册的是默认的SharedPreferences,所以取消注册的时候我也是先获取的默认的SharedPreferences。

5.4、参考

参考地址

六、偏好设置实例

6.1、PreferenceFragmentCompat

其实还有对应的activity的实现,但是谷歌官方推荐使用Fragment,使用更灵活。

在fragment中继承PreferenceFragmentCompat,实现方法onCreatePreferences,从xml资源文件中添加preferences:

  1. @Override
  2. public void onCreatePreferences(Bundle bundle, String s) {
  3. addPreferencesFromResource(R.xml.pref_visualizer);
  4. }

pref_visualizer资源文件如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
  3. <CheckBoxPreference
  4. android:defaultValue="@bool/pref_show_bass_default"
  5. android:key="@string/pref_show_bass_key"
  6. android:summaryOff="@string/hidden"
  7. android:summaryOn="@string/show"
  8. android:title="@string/show_base_label" />
  9. <CheckBoxPreference
  10. android:defaultValue="@bool/pref_show_mid_default"
  11. android:key="@string/pref_show_mid_key"
  12. android:summaryOff="@string/hidden"
  13. android:summaryOn="@string/show"
  14. android:title="@string/show_mid_label" />
  15. <CheckBoxPreference
  16. android:defaultValue="@bool/pref_show_treble_default"
  17. android:key="@string/pref_show_treble_key"
  18. android:summaryOff="@string/hidden"
  19. android:summaryOn="@string/show"
  20. android:title="@string/show_treble_label" />
  21. <EditTextPreference
  22. android:defaultValue="@string/pref_size_default"
  23. android:key="@string/pref_size_key"
  24. android:title="@string/setting_size_label"/>
  25. <ListPreference
  26. android:defaultValue="@string/pref_color_red_value"
  27. android:entries="@array/pref_color_option_labels"
  28. android:entryValues="@array/pref_color_option_values"
  29. android:key="@string/pref_color_key"
  30. android:title="@string/selector_color" />
  31. </PreferenceScreen>

这里的EditTextPreference和ListPreference默认没有描述值,需要在代码中添加描述

  1. @Override
  2. public void onCreatePreferences(Bundle bundle, String s) {
  3. addPreferencesFromResource(R.xml.pref_visualizer);
  4. PreferenceScreen preferenceScreen = getPreferenceScreen();
  5. SharedPreferences sharedPreferences = preferenceScreen.getSharedPreferences();
  6. int count = preferenceScreen.getPreferenceCount();
  7. for (int i = 0; i < count; i++) {
  8. Preference preference = preferenceScreen.getPreference(i);
  9. if (!(preference instanceof CheckBoxPreference)) {
  10. String value = sharedPreferences.getString(preference.getKey(), getString(R.string.pref_color_red_value));
  11. setupPreferenceSummary(preference, value);
  12. }
  13. }
  14. Preference preference = findPreference(getString(R.string.pref_size_key));
  15. preference.setOnPreferenceChangeListener(this);
  16. }
  17. private void setupPreferenceSummary(Preference preference, String s) {
  18. if (preference instanceof ListPreference) {
  19. ListPreference listPreference = (ListPreference) preference;
  20. int position = listPreference.findIndexOfValue(s);
  21. if (position >= 0) {
  22. listPreference.setSummary(listPreference.getEntries()[position]);
  23. }
  24. } else if (preference instanceof EditTextPreference) {
  25. EditTextPreference editTextPreference = (EditTextPreference) preference;
  26. editTextPreference.setSummary(s);
  27. }
  28. }

监听EditTextPreference和ListPreference的值修改后,更新描述内容

在fragment的onCreate方法中注册监听器,需要先在fragment中implements SharedPreferences.OnSharedPreferenceChangeListener

  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
  5. }

设置EditTextPreference和ListPreference的值修改后显示正确的描述内容

  1. @Override
  2. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
  3. Preference preference = findPreference(key);
  4. if (null != preference) {
  5. if (!(preference instanceof CheckBoxPreference)) {
  6. String value = sharedPreferences.getString(preference.getKey(), getString(R.string.pref_color_red_value));
  7. setupPreferenceSummary(preference, value);
  8. }
  9. }
  10. }

别忘了要在onDestroy方法中取消注册:

  1. @Override
  2. public void onDestroy() {
  3. super.onDestroy();
  4. getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
  5. }

注意,我们这里用到了EditTextPreference,因为我这里希望只获取float类型的值,如果用户输入其它类型的值,会在赋值的时候导致类型异常报错,所以我们要在修改Preference值之前先对用户输入的内容进行判断处理。

为了解决这个问题,我们可以在fragment中implements Preference.OnPreferenceChangeListener,然后实现对应的onPreferenceChange方法,onPreferenceChange方法实现如下,如果用户输入我们期待的数据类型,则return true,否则return false:

  1. @Override
  2. public boolean onPreferenceChange(Preference preference, Object newValue) {
  3. Toast error = Toast.makeText(getContext(), "Please select a number between 0.1 and 3", Toast.LENGTH_SHORT);
  4. String sizeKey = getString(R.string.pref_size_key);
  5. if (preference.getKey().equals(sizeKey)) {
  6. String stringSize = ((String) (newValue)).trim();
  7. if (stringSize.equals("")) stringSize = "1";
  8. try {
  9. float size = Float.parseFloat(stringSize);
  10. if (size > 3 || size <= 0) {
  11. error.show();
  12. return false;
  13. }
  14. } catch (NumberFormatException nfe) {
  15. error.show();
  16. return false;
  17. }
  18. }
  19. return true;
  20. }

设置修改Preference前的回调,该监听不需要在退出的时候取消注册,通过对比方法名可以看出,这里是set方法,不是register:

  1. Preference preference = findPreference(getString(R.string.pref_size_key));
  2. preference.setOnPreferenceChangeListener(this);

注意,使用PreferenceFragmentCompat需要在application的主题中添加属性,否则在打开引用PreferenceFragmentCompat的页面会报错:

<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>

此外,PreferenceScreen还可以设置偏好类别和通过代码code的方式引入PreferenceScreen而不仅仅是通过xml的方式引入,更多相关内容可以查看官方用户指南链接

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号