数据存储: CheckBoxPreference

article/2025/10/26 18:03:38

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


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


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




项目结构图:




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


demo.xml 文件:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="Demo for checkboxpreference" > <CheckBoxPreference android:key="key_cbp" android:title="checkbox" android:summary="this is a demo" android:summaryOn="open me" android:summaryOff="close me" android:persistent="false"/> </PreferenceScreen>
代码部分,是一个继承自 PreferenceActivity 的类:

package mark.zhang; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.util.Log; public class DemoActivity extends PreferenceActivity implements OnPreferenceClickListener, OnPreferenceChangeListener { private static final String KEY = "key_cbp"; private CheckBoxPreference cbp = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.demo); cbp = (CheckBoxPreference) findPreference(KEY); cbp.setOnPreferenceClickListener(this); cbp.setOnPreferenceChangeListener(this); } @Override public boolean onPreferenceClick(Preference preference) { Log.d("mark", "onPreferenceClick is invoked !"); return false; } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.d("mark", "onPreferenceChange is invoked !"); return false; } }
在这个类中,实现两个接口,接口方法会在点击该 CheckBoxPreference 时回调。


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


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

True to update the state of the Preference with the new value.
可以看出,在这个方法的结尾返回 true 就可以了,呵呵!这点要注意,细节决定效率嘛!


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


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

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


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



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


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

protected void onClick() { super.onClick(); boolean newValue = !isChecked(); // in onBindView() an AccessibilityEventViewClickedType is sent to announce the change // not sending mSendAccessibilityEventViewClickedType = true; if (!callChangeListener(newValue)) { return; } setChecked(newValue); }
那麽,

setChecked(newValue)

方法就可以调用,

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


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

package mark.zhang; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.util.Log; public class DemoActivity extends PreferenceActivity implements OnPreferenceClickListener, OnPreferenceChangeListener, OnSharedPreferenceChangeListener { private static final String KEY = "key_cbp"; private CheckBoxPreference cbp = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.demo); cbp = (CheckBoxPreference) findPreference(KEY); cbp.setOnPreferenceClickListener(this); // 注册OnPreferenceChangeListene // cbp.setOnPreferenceChangeListener(this); // 注册 SharedPreferenceChangeListener // 以便回调 onSharedPreferenceChangeListener getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override public boolean onPreferenceClick(Preference preference) { Log.d("mark", "onPreferenceClick is invoked !"); if (cbp.isChecked()) { // false Log.d("mark", "cbp.isChecked() = " + cbp.isChecked()); } // return true; return false; } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference.getKey().equals(KEY)) { Log.d("mark", "onPreferenceChange is invoked !" + newValue); // true } // 不可以选择CheckBox // return false; // 可以选择CheckBox return true; } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals(KEY)) { boolean value = sharedPreferences.getBoolean(key, false); Log.d("mark", "onSharedPreferenceChanged is invoked !" + " and the value = " + value); } } @Override protected void onDestroy() { // 注销 SharedPreferenceChangeListener getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( this); super.onDestroy(); } }
运行之后,可以看到如下打印信息:

D/mark ( 8077): onSharedPreferenceChanged is invoked ! and the value = false D/mark ( 8077): onPreferenceClick is invoked ! D/mark ( 8077): onSharedPreferenceChanged is invoked ! and the value = true D/mark ( 8077): onPreferenceClick is invoked ! D/mark ( 8077): cbp.isChecked() = true
提醒一点,如果不注册onSharedPreferenceChangListener:

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
是不会回调onSharedPreferenceChanged 方法的。









http://chatgpt.dhexx.cn/article/fx3frXjV.shtml

相关文章

CheckBoxPreference组件

CheckBoxPreference 选中为true 取消选中为false 它的值会以boolean的形式储存在SharedPreferences中。 <?xml version"1.0" encoding"utf-8"?><PreferenceScreenxmlns:android"http://schemas.android.com/apk/res/android"><…

Android 自定义CheckBoxPreference的CheckBox复选框

在使用Android的Preference&#xff0c;有时为了让我们的界面更加美观&#xff0c;我们会自定义自己的Preference。今天就主要说一下怎样自定义CheckBoxPreference的CheckBox按钮。 系统默认CheckBoxPreference的CheckBox样式 自定义后的CheckBox样式 其实&#xff0c;关键的一…

最好用的手机端C/C++语言编程软件, 不要说没电脑就不学编程了!

今天介绍一个软件—C编译器(c4droid)&#xff0c;可以直接编辑运行C/C程序&#xff0c;代码高亮、语法检查&#xff0c;使用起来非常不错&#xff0c;下面我简单介绍一下这个软件的安装和使用&#xff1a; 安装C编译器&#xff0c;这个直接在手机应用中搜索就行&#xff0c;如…

最新版手机端C/C++语言编程的软件

今天介绍一个软件—C编译器(c4droid)&#xff0c;可以直接编辑运行C/C程序&#xff0c;代码高亮、语法检查&#xff0c;使用起来非常不错&#xff0c;下面我简单介绍一下这个软件的安装和使用&#xff1a; 安装C编译器&#xff0c;这个直接在手机应用中搜索就行&#xff0c;如…

C语言编程工具软件推荐

c语言编程软件适于编写系统软件&#xff0c;是学习编程的同学们的必备软件。c语言一种非常强大的计算机语言&#xff0c;应用非常广泛&#xff0c;不仅仅是在软件开发上&#xff0c;而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程工具 中国有句古话叫做“工欲善其…

c语言编程软件有哪些 Win7下用哪种C语言编译器

C语言是一门历史很长的编程语言&#xff0c;其编译器和开发工具也多种多样&#xff0c;其开发工具包括编译器&#xff0c;现举几个开发工具供大家选择&#xff0c;当然也要根据自己的操作系统来选择适合自己的开发工具 好多刚开始接触c语言的朋友都想知道用上面软件开发c语言…

手机上可以编程看代码的软件

以后大家会在路上看到很多人拿着手机,他不是在聊天,他有可能是运维工程师、也可能是算法开发、也可能是java开发,还可能是客户端开发,也可能是前端开发... 让你编程一直在路上,这到底是程序员的福音,还是码农的枷锁。 粉丝提问: 这里介绍几款可以在手机上编程的app,分…

学习c语言编程用什么软件_用C编程

学习c语言编程用什么软件 We would start writing basic programs in C now. You need to have required software installed and configured in your system. Refer to the article of Hello World and ensure that you are able to compile and run the program. 我们现在就开…

怎样查看C语言的程序内容,什么手机软件能看c语言文件?

C语言编译器和C编译器这2个手机软件就可以&#xff0c;而且还可以直接运行C语言程序&#xff0c;使用起来非常方便&#xff0c;下面我简单介绍一下这2个软件的安装和使用&#xff0c;感兴趣的朋友可以在自己手机上尝试一下&#xff1a; C语言编译器 这是手机上一个纯粹的C语言编…

c语言编程开发app,C语言编程app

C语言编程是一款掌上C语言学习软件&#xff0c;平台为用户提供专业的C语言学习资源&#xff0c;用户可以随时在线进行刷题学习&#xff0c;还能将错题记录和题目收藏&#xff0c;方便用户进行针对训练&#xff0c;轻松备考计算机二级&#xff0c;有需要的朋友快来下载吧&#x…

C语言编译器(C语言编程软件)

桌面操作系统 对于当前主流桌面操作系统而言&#xff0c;可使用 Visual C、GCC 以及 LLVM Clang 这三大编译器。 Visual C&#xff08;简称 MSVC&#xff09;是由微软开发的&#xff0c;只能用于 Windows 操作系统&#xff1b;GCC 和 LLVM Clang 除了可用于 Windows 操作系统…

c语言程序设计网站有哪些,C语言编程软件有哪些?

C语言是一门通用计算机编程语言&#xff0c;应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能&#xff0c;但仍然保持着良好跨平台的特性&#xf…

最火的C语言编程软件,适合编写C语言代码的编程软件有哪些

C语言基本上是大学计算机及其相关专业在大一上学期就会开的一门课程,但是很多学生就是在大一上学期期末的时候很着急,因为自己完全没有学好C语言,感觉一学期白学了,其实究其主要原因,还是因为你在上课认真听了,也做了课堂作业,但是却没有在课后好好的自己去主动敲代码,…

常用的C语言编程工具

中国有句古话叫做“工欲善其事&#xff0c;必先利其器”&#xff0c;可见我们对工具的利用是从祖辈就传下来的&#xff0c;而且也告诉我们在开始做事之前先要把工具准备好。有了好的工具那么我们做起事来也会事半功倍。学习C语言也是一样的&#xff0c;对于初学者来说往往选择一…

手机上做c语言作业的软件下载,c语言编程软件手机版下载-C语言编程 安卓版v1.0.2-PC6安卓网...

C语言编程这是为众多考证用户专门制作的在线学习软件&#xff0c;C语言编程app将考证要用到的相关知识归纳好经过题库的形式来让大家熟练和上手&#xff0c;C语言编程app可以协助大家经过二级计算机考试。 软件介绍 C语言编程是一款掌上C语言学习软件&#xff0c;平台为用户提供…

C语言学习——编程软件安装和使用

C语言学习——软件安装和使用 C语言编程软件适于编写系统软件&#xff0c;是学习编程的同学们的必备软件。今天小编给大家推荐一下自己用的C语言编程软件。 一、Microsoft Visual C 2010 Express &#xff08;国家计算机等级专用&#xff09; 链接:https://pan.baidu.com/s/…

C/C++编程工具及实用小软件推荐

目录 1、概述 2、IDE开发工具介绍 2.1、Visual Studio 2.2、QT Creator 3、代码查看与编辑工具 3.1、Visual Studio Code 3.2、Source Insight 4、实用小软件工具推荐 4.1、Notepad 4.2、Everything 5、最后 经常有C/C初学者会问&#xff0c;有哪些常用的IDE开发编程…

c语言程序设计是系统软件吗,学习c语言和编程c语言的电脑软件和手机软件有哪些?...

C语言作为一门起源比较早的编程语言&#xff0c;可以编程的手机软件和电脑软件非常多&#xff0c;下面我简单介绍几个&#xff0c;感兴趣的朋友可以自己尝试一下&#xff1a; 手机软件 1.C语言编译器&#xff1a;这是手机上的一个C语言编程软件&#xff0c;可以直接在手机上编译…

C/C++ 用什么软件编程

一款方便顺手的编程软件对于 C/C 开发者们来说&#xff0c;无疑会节省非常多不必要的环境安装和学习使用教程的时间。看到一些回答围绕不同操作系统&#xff0c;推荐了不同的IDE。我在这里给大家介绍一个全平台都通用、轻量且功能强大的在线编辑器 Lightly。它是首个根据中国开…

推荐几款好用的手机编程APP!

各位,很多人现在喜欢用手机写代码,今天小编就带大家盘点几款手机端编程软件。 程序员相关的海量资料,点击免费获取 1 C4droid 【适用编程语言】 C/C++ 【适用平台】 Android 2.2+ 【软件介绍】 付费软件(国内免费,c4droid是款Android设备上的C/C++程序IDE(集成开…