最近,做一个项目,使用 Preference 非常频繁,之前就很想写一些关于 android 数据存储的文章,这次机会来了。

先从小出着手吧,CheckBoxPreference 小巧可爱,使用简单。但是使用的时候,还是需要注意一些问题。下面开始讨论吧,欢迎拍砖!

app 运行之后,效果(很单调):

项目结构图:

这里关键是在 res/ 目录下面新建 xml 文件夹,然后新建我们需要的 Preference 布局(demo.xml)。

demo.xml 文件:

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:title="Demo for checkboxpreference" >
  4. <CheckBoxPreference
  5. android:key="key_cbp"
  6. android:title="checkbox"
  7. android:summary="this is a demo"
  8. android:summaryOn="open me"
  9. android:summaryOff="close me"
  10. android:persistent="false"/>
  11. </PreferenceScreen>

代码部分,是一个继承自 PreferenceActivity 的类:

[java] view plaincopyprint?
  1. package mark.zhang;
  2. import android.os.Bundle;
  3. import android.preference.CheckBoxPreference;
  4. import android.preference.Preference;
  5. import android.preference.PreferenceActivity;
  6. import android.preference.Preference.OnPreferenceChangeListener;
  7. import android.preference.Preference.OnPreferenceClickListener;
  8. import android.util.Log;
  9. public class DemoActivity extends PreferenceActivity implements OnPreferenceClickListener,
  10. OnPreferenceChangeListener {
  11. private static final String KEY = "key_cbp";
  12. private CheckBoxPreference cbp = null;
  13. @Override
  14. public void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. addPreferencesFromResource(R.xml.demo);
  17. cbp = (CheckBoxPreference) findPreference(KEY);
  18. cbp.setOnPreferenceClickListener(this);
  19. cbp.setOnPreferenceChangeListener(this);
  20. }
  21. @Override
  22. public boolean onPreferenceClick(Preference preference) {
  23. Log.d("mark", "onPreferenceClick is invoked !");
  24. return false;
  25. }
  26. @Override
  27. public boolean onPreferenceChange(Preference preference, Object newValue) {
  28. Log.d("mark", "onPreferenceChange is invoked !");
  29. return false;
  30. }
  31. }

在这个类中,实现两个接口,接口方法会在点击该 CheckBoxPreference 时回调。

似乎,上面的内容没有什么很难的地方,的确!但是运行 App 之后,你会发现 CheckBox 不可以选择?!

在 API 的文档关于 onPreferenceChange 方法中有这么一句:

[html] view plaincopyprint?
  1. True to update the state of the Preference with the new value.

可以看出,在这个方法的结尾返回 true 就可以了,呵呵!这点要注意,细节决定效率嘛!

ok,再看第二个问题,我们知道 Preference 可以自动保存状态值,保存是以 xml 文件形式保存的,保存路径在 /data/data/packageName/shared_prefs/×××.xml,但是你到这个路径去找找绝对找不到?!

原因在于我们所写的 demo.xml 文件,在这个文件中,有这么一句:

[html] view plaincopyprint?
  1. android:persistent="false"

这就表示不会保存 CheckBoxPreference 这个值(是一个 boolean 值,选择上就是 true,否则就是false)了。

如果,你设置这个属性为 true,android 就会为你自动保存,看下图:

但是为什么会自动保存?为什么文件名称就是 mark.zhang_preference 呢?当然是代码决定的,看源码,就会一目了然了!

当我们点击 CheckBoxPreference 的时候,会触发事件:

[java] view plaincopyprint?
  1. protected void onClick() {
  2. super.onClick();
  3. boolean newValue = !isChecked();
  4. // in onBindView() an AccessibilityEventViewClickedType is sent to announce the change
  5. // not sending
  6. mSendAccessibilityEventViewClickedType = true;
  7. if (!callChangeListener(newValue)) {
  8. return;
  9. }
  10. setChecked(newValue);
  11. }

那麽,

[java] view plaincopyprint?
  1. setChecked(newValue)

方法就可以调用,

[java] view plaincopyprint?
  1. persistBoolean(checked);

方法,该方法是 Preference 类的方法,然后调用 PreferenceManager 相关的方法获取 SharedPreference 来保存文件。

最后,看一个小问题,就是如何动态获取 CheckBoxPreerence 的值呢?很简单,实现 OnSharedPreferenceChangeListener 接口,看代码:

[java] view plaincopyprint?
  1. package mark.zhang;
  2. import android.content.SharedPreferences;
  3. import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
  4. import android.os.Bundle;
  5. import android.preference.CheckBoxPreference;
  6. import android.preference.Preference;
  7. import android.preference.PreferenceActivity;
  8. import android.preference.Preference.OnPreferenceChangeListener;
  9. import android.preference.Preference.OnPreferenceClickListener;
  10. import android.util.Log;
  11. public class DemoActivity extends PreferenceActivity implements OnPreferenceClickListener,
  12. OnPreferenceChangeListener, OnSharedPreferenceChangeListener {
  13. private static final String KEY = "key_cbp";
  14. private CheckBoxPreference cbp = null;
  15. @Override
  16. public void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. addPreferencesFromResource(R.xml.demo);
  19. cbp = (CheckBoxPreference) findPreference(KEY);
  20. cbp.setOnPreferenceClickListener(this);
  21. // 注册OnPreferenceChangeListene
  22. // cbp.setOnPreferenceChangeListener(this);
  23. // 注册 SharedPreferenceChangeListener
  24. // 以便回调 onSharedPreferenceChangeListener
  25. getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
  26. }
  27. @Override
  28. public boolean onPreferenceClick(Preference preference) {
  29. Log.d("mark", "onPreferenceClick is invoked !");
  30. if (cbp.isChecked()) { // false
  31. Log.d("mark", "cbp.isChecked() = " + cbp.isChecked());
  32. }
  33. // return true;
  34. return false;
  35. }
  36. @Override
  37. public boolean onPreferenceChange(Preference preference, Object newValue) {
  38. if (preference.getKey().equals(KEY)) {
  39. Log.d("mark", "onPreferenceChange is invoked !" + newValue); // true
  40. }
  41. // 不可以选择CheckBox
  42. // return false;
  43. // 可以选择CheckBox
  44. return true;
  45. }
  46. @Override
  47. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
  48. if (key.equals(KEY)) {
  49. boolean value = sharedPreferences.getBoolean(key, false);
  50. Log.d("mark", "onSharedPreferenceChanged is invoked !" + " and the value = " + value);
  51. }
  52. }
  53. @Override
  54. protected void onDestroy() {
  55. // 注销 SharedPreferenceChangeListener
  56. getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
  57. this);
  58. super.onDestroy();
  59. }
  60. }

运行之后,可以看到如下打印信息:

[html] view plaincopyprint?
  1. D/mark    ( 8077): onSharedPreferenceChanged is invoked ! and the value = false
  2. D/mark    ( 8077): onPreferenceClick is invoked !
  3. D/mark    ( 8077): onSharedPreferenceChanged is invoked ! and the value = true
  4. D/mark    ( 8077): onPreferenceClick is invoked !
  5. D/mark    ( 8077): cbp.isChecked() = true

提醒一点,如果不注册onSharedPreferenceChangListener:

[java] view plaincopyprint?
  1. getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

是不会回调 onSharedPreferenceChanged 方法的。

CheckBoxPreference--数据存储相关推荐

  1. 英特尔 QLC 3D NAND 数据存储

    英特尔 QLC 3D NAND 数据存储 NAND是什么 由于SSD固态硬盘的普及,NAND这个词逐渐进入用户们的视线.许多厂商都在产品宣传中提到3D NAND颗粒等词汇,对于普通用户来讲,完全不知道 ...

  2. Android的数据存储方式

    1.Shared Preferences 2.文件存储数据 3.数据库 4.Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数 ...

  3. mysql更改数据库数据存储目录_MySQL更改数据库数据存储目录

    MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤. 1:确认MySQL数据库存储目 ...

  4. AS3.0编程 So本地数据存储(“超级cookies”)--AS3:Local SharedObject

    Flash影片运行过程中,大多数的数据都存储于影片本身,一旦影片被关闭,这些数据也就从内存中被清除掉,下次运行时,数据将从头开始.若想存储数据或者让客户端的多个影片共享同一组数据,就要想办法把数据存储 ...

  5. Java中数据存储方式

    2019独角兽企业重金招聘Python工程师标准>>> 1. 寄存器(register).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限, ...

  6. IOS数据存储之文件沙盒存储

    前言: 之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了.文件沙盒存储主要存储非机密数据,大的数据. ...

  7. 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略

    大数据处理当中,数据储存始终是一个重要的环节,从现阶段的市场现状来说,以Hadoop为首的大数据技术框架,仍然占据主流地位,而Hadoop的HDFS,在数据存储方面,仍然得到重用.今天的大数据入门分享 ...

  8. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

  9. Android数据存储(三)——SQLite

    如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite. SQLite的特点:轻量级.嵌入式的.关系型数据库.可移植性好,易使用,小,高效且可靠,与使用 ...

  10. 希捷发布CORTX对象存储软件与开源社区,普惠超大规模数据存储

    数据存储和管理解决方案提供商希捷科技今日(10月29日)举行了"Let's Rethink Data"希捷科技Datasphere线上峰会.在本次峰会,希捷科技携手行业专家与生态合 ...

最新文章

  1. 过程即奖励(The Journey is the Reward)
  2. 茶杯头开枪ahk代码
  3. 为什么在生产中进行硒自动化测试对于您的下一个版本至关重要?
  4. LeetCode 1389. 按既定顺序创建目标数组
  5. Android 系统(144)---整包升级与差分升级的区别
  6. json学习之三:JSONArray的应用
  7. 统一返回对象和异常处理(一)
  8. Linux内核中流量控制(12)
  9. Android学习系列--App缓存管理
  10. 【经典算法实现 16】阿克曼函数(非递归实现 代码优化)
  11. 数字信号音频采集及时域频域加噪设计滤波器处理项目入门
  12. Speedoffice(Excel)行高列宽自动调整的方法
  13. 微信小程序连接蓝牙汉印HM-A300L标签打印机
  14. 74HC595芯片工作原理细致分析(以及级联拓展应用),以及芯片控制继电器原理 / 代码
  15. 真正免费的国外PHP建站空间
  16. ASP.NET MVC 上传文件方法
  17. 泰克TBS1000X示波器仪器的使用
  18. 编译器与Debug的传奇:Grace Murray Hopper小传
  19. html文件如何设置为桌面壁纸,怎样把文件里的图片设置为桌面背景时全部是全屏图?最好详细一点的。...
  20. WEB安全字体(Web Safe Fonts)-网页设计用什么字体兼容性好?

热门文章

  1. 第一章 信息化与信息系统习题
  2. 超图(Hypergraph)概念理解
  3. Eclipse, jsp代码修改之后,页面却没有变化!解决思路
  4. 【数据产品案例】阿里生意参谋-用户分析
  5. Changer常用的软件
  6. SQL教程——常见的约束类型
  7. Qt之布局Layout的应用
  8. 什么是 UCOS操作系统及特点
  9. 在线matlab,亲测好用
  10. 【JAVA 数据结构】 JAVA实现动态数组