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





推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
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社区 版权所有