热门标签 | 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 方法的。





推荐阅读
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
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社区 版权所有