热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CheckBoxPreference数据存储

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

最近,做一个项目,使用 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&#61;"http://schemas.android.com/apk/res/android"  
  3.     android:title&#61;"Demo for checkboxpreference" >  
  4.   
  5.     <CheckBoxPreference  
  6.         android:key&#61;"key_cbp"  
  7.         android:title&#61;"checkbox"   
  8.          android:summary&#61;"this is a demo"  
  9.         android:summaryOn&#61;"open me"  
  10.         android:summaryOff&#61;"close me"  
  11.         android:persistent&#61;"false"/>  
  12.   
  13. PreferenceScreen>  




代码部分&#xff0c;是一个继承自 PreferenceActivity 的类&#xff1a;


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



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


似乎&#xff0c;上面的内容没有什么很难的地方&#xff0c;的确&#xff01;但是运行 App 之后&#xff0c;你会发现 CheckBox 不可以选择&#xff1f;&#xff01;


在 API 的文档关于 onPreferenceChange 方法中有这么一句&#xff1a;


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




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


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


原因在于我们所写的 demo.xml 文件&#xff0c;在这个文件中&#xff0c;有这么一句&#xff1a;


[html] view plaincopyprint?
  1. android:persistent&#61;"false"  




这就表示不会保存 CheckBoxPreference 这个值&#xff08;是一个 boolean 值&#xff0c;选择上就是 true&#xff0c;否则就是false&#xff09;了。


如果&#xff0c;你设置这个属性为 true&#xff0c;android 就会为你自动保存&#xff0c;看下图&#xff1a;



但是为什么会自动保存&#xff1f;为什么文件名称就是 mark.zhang_preference 呢&#xff1f;当然是代码决定的&#xff0c;看源码&#xff0c;就会一目了然了&#xff01;


当我们点击 CheckBoxPreference 的时候&#xff0c;会触发事件&#xff1a;


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




那麽&#xff0c;


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

方法就可以调用&#xff0c;


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


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


最后&#xff0c;看一个小问题&#xff0c;就是如何动态获取 CheckBoxPreerence 的值呢&#xff1f;很简单&#xff0c;实现 OnSharedPreferenceChangeListener 接口&#xff0c;看代码&#xff1a;


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




运行之后&#xff0c;可以看到如下打印信息&#xff1a;


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




提醒一点&#xff0c;如果不注册onSharedPreferenceChangListener&#xff1a;


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



是不会回调 onSharedPreferenceChanged 方法的。





推荐阅读
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
  • iOS 开发技巧:TabBarController 自定义与本地通知设置
    本文介绍了如何在 iOS 中自定义 TabBarController 的背景颜色和选中项的颜色,以及如何使用本地通知设置应用程序图标上的提醒个数。通过这些技巧,可以提升应用的用户体验。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 本文介绍了如何使用Java代码在Android设备上检测特定应用程序是否已安装。通过创建一个Intent并利用PackageManager查询该Intent的可用性来实现这一功能。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 尝试执行数据库模式加载时遇到错误'Mysql2::Error: 指定的键太长;最大键长度为767字节'。本文将探讨这一问题的成因及解决方案。 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • Logback使用小结
    1一定要使用slf4j的jar包,不要使用apachecommons的jar。否则滚动生成文件不生效,不滚动的时候却生效~~importorg.slf ... [详细]
  • ML学习笔记20210824分类算法模型选择与调优
    3.模型选择和调优3.1交叉验证定义目的为了让模型得精度更加可信3.2超参数搜索GridSearch对K值进行选择。k[1,2,3,4,5,6]循环遍历搜索。API参数1& ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
author-avatar
清醒还是迷惘_123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有