Android开发--详解SharedPreference/PreferenceActivity

article/2025/10/29 22:39:30

    我们经常看到应用程序的设置页面,一般用到设置页面时,我们会继承自PreferenceActivity,它实现了SharedPreference,并生成相应的XML文件自动保存用户的设置,在设置页面中,每一个列表项都是一个Preference,如果要实现点击某一项有所反应,就需要实现OnPreferenceChangeListener接口,并使得某一个Preference绑定一个监听器,下面的截图是作者实现的一个设置界面:


实现这个界面的XML文件如下:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory  android:title="我的设置"><!-- 此外,还有一个控件为,ListPreference,单击该控件会弹出一个带ListView的对话框 --><!-- 该控件相当于CheckBox --><CheckBoxPreference android:key="wireless_network"android:title="使用无线网络"android:summary="使用无线网络查看应用程序(例如Google地图)中的位置"/><CheckBoxPreference android:key="gps_satellite_setting"android:title="启用GPS卫星设置"android:summary="定位时,精确到街道级别(取消选择可节约电量)"/>
</PreferenceCategory><PreferenceCategory  android:title="个人信息设置"><CheckBoxPreference android:key="yesno_save_info"android:title="是否保存个人信息"/><!-- 单击该控件会弹出一个带EditText的对话框 --><EditTextPreference android:key="individual_name"android:title="姓名" android:summary="请输入真实姓名"/><!-- 这是一个子设置页面,但是如果如在代码中设置,打开后是黑色的背景,看不到内容 --> <PreferenceScreen android:key="other_individual_msg"android:title="其他个人信息" android:summary="是否工作,手机"><CheckBoxPreference android:key="is_an_employee"android:title="是否工作"/><EditTextPreference android:key="mobile"android:title="手机" android:summary="请输入真实的手机号"/></PreferenceScreen></PreferenceCategory></PreferenceScreen>

其中实现相应的功能,功能的实现代码都有相应的注释:

public class SharedActivity extends PreferenceActivity implements OnPreferenceChangeListener{@SuppressWarnings("deprecation")@Override/**在onCreate方法中需要做一下几点工作*1.修改PreferenceActivity保存数据使用的XML文件的名称,在默认情况下,保存key-value对的XML文件是<package_name>_preferences.xml*在本例中我将这些键值对保存才setting中*2.设置”姓名“列表项是否可用*3.每一个列表项就是一个Preference对象,要实现单击响应,就必须要绑定响应的监听器*/protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//改变PreferenceActivity保存数据使用的XML文件的名称getPreferenceManager().setSharedPreferencesName("setting");//不需要设置布局文件,只需要使用如下的代码装载xml文件即可addPreferencesFromResource(R.xml.activity_shared);Preference individualNamePreference=findPreference("individual_name");//获得指向setting.xml文件的SharedPreference对象SharedPreferences sharedPreferences=individualNamePreference.getSharedPreferences();//设置姓名列表项的SummaryindividualNamePreference.setSummary(sharedPreferences.getString("individual_name", "请输入真实姓名"));Preference mobilePreference=findPreference("mobile");SharedPreferences sharedPreferences2=mobilePreference.getSharedPreferences();mobilePreference.setSummary(sharedPreferences2.getString("mobile", "请输入真实的手机号码"));//设置“姓名”列表项是否可用if(sharedPreferences.getBoolean("yesno_save_info", false)){individualNamePreference.setEnabled(true);}else {individualNamePreference.setEnabled(false);}individualNamePreference.setOnPreferenceChangeListener(this);mobilePreference.setOnPreferenceChangeListener(this);/** 在Preference中设置使用Theme.Light主题,则打开Preference为白色主题, * 当Preference中内嵌有其他PreferenceScreen的时候, * 打开内嵌的PreferenceScreen则屏幕背景为黑色的.* 下面的这个方法实现的是:* 在打开内嵌PreferenceScreen的时候设置其背景色.*/PreferenceScreen s= (PreferenceScreen) findPreference("other_individual_msg");  s.setOnPreferenceClickListener(new OnPreferenceClickListener() {  @Override  public boolean onPreferenceClick(Preference preference) {  PreferenceScreen a = (PreferenceScreen) preference;  a.getDialog().getWindow().  setBackgroundDrawableResource(android.R.drawable.screen_background_light);  return false;  }  }); }@SuppressWarnings("deprecation")@Overridepublic boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) {if("yesno_save_info".equals(preference.getKey())){findPreference("individual_name").setEnabled(!findPreference("individual_name").isEnabled());}// TODO Auto-generated method stubreturn super.onPreferenceTreeClick(preferenceScreen, preference);}/** 必须要实现OnPreferenceChangeListener接口,该回调函数的功能是捕获列表项中的值改变后的情况* @see android.preference.Preference.OnPreferenceChangeListener#onPreferenceChange(android.preference.Preference, java.lang.Object)*/@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {// TODO Auto-generated method stubpreference.setSummary(String.valueOf(newValue));//一定要返回true,否则列表项的值不会改变return true;}}



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

相关文章

Android之PreferenceActivity 详解

看到很多书中都没有对PreferenceActivity做介绍&#xff0c;而我正好又在项目中用到&#xff0c;所以就把自己的使用的在这总结一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下面的截图&#xff1a; Android系统截图&#xff08;左&#xff09; …

android的PreferenceActivity

前言 这段时间在研究android平台上的开源项目——StandupTimer&#xff0c;这是由jwood所设计的一个较为简单android应用&#xff0c;用于控制会议时间&#xff0c;类似秒表倒计时。 PreferenceActivity PreferenceActivity是android提供的对系统信息和配置进行自动保存的Activ…

用StopWatch统计耗时,比System.currentTimeMillis好用

平时项目中统计耗时都用System.currentTimeMillis&#xff0c;最近看到一个spring-StopWatch统计耗时&#xff0c;其用法简单明了&#xff0c;比传统统计耗时方法好用。 StopWatch 的内部是通过 System.nanoTime() 来计时的&#xff0c;本质和 System.currentTimeMillis() 差别…

并发慎用——System.currentTimeMillis()

好记忆不如烂笔头&#xff0c;能记下点东西&#xff0c;就记下点&#xff0c;有时间拿出来看看&#xff0c;也会发觉不一样的感受. System.currentTimeMillis()是极其常用的基础Java API&#xff0c;广泛地用来获取时间戳或测量代码执行时长等&#xff0c;在我们的印象中应该快…

System.currentTimeMillis()的性能问题以及解决方法

System.currentTimeMillis()是极其常用的基础Java API&#xff0c;广泛地用来获取时间戳或测量代码执行时长等&#xff0c;在我们的印象中应该快如闪电。但实际上在并发调用或者特别频繁调用它的情况下&#xff08;比如一个业务繁忙的接口&#xff0c;或者吞吐量大的需要取得时…

统计代码执行时间时,System.currentTimeMillis()与System.nanoTime()哪个更适合?

目录 1.nanoTime是什么&#xff1f; 2.currentTimeMillis是什么&#xff1f; 3.nanoTime与currentTimeMillis在JDK中阐述 4.nanoTime与currentTimeMillis使用对比 5.深究从OpenJDK源代码、glibc&#xff0c;一直到Linux内核 6.总结 1.nanoTime是什么&#xff1f; ns&…

System.currentTimeMillis的性能如何

一、背景 撸代码时发现System.currentTimeMillis的调用都被封装成了cache类型&#xff0c;代码如下: 那么System.currentTimeMillis真的有这么这么差吗&#xff0c;如果差的话又是什么原因造成的&#xff1f;什么情况下可以直接调用原生方法&#xff0c;什么情况下需要使用缓存…

别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅

大家好&#xff0c;我是二哥呀&#xff01; 昨天&#xff0c;一位球友问我能不能给他解释一下 SpringBootApplication 注解是什么意思&#xff0c;还有 Spring Boot 的运行原理&#xff0c;于是我就带着他扒拉了一下这个注解的源码&#xff0c;还有 SpringApplication 类的 ru…

System.currentTimeMillis的性能,真有如此不堪吗?

# 疑惑&#xff0c;System.currentTimeMillis真有性能问题&#xff1f; 最近我在研究一款中间件的源代码时&#xff0c;发现它获取当前时间不是通过System.currentTimeMillis&#xff0c;而是通过自定义的System.currentTimeMillis的缓存类&#xff08;见下方&#xff09;&…

疑惑,System.currentTimeMillis真有性能问题?

点击关注公众号&#xff0c;Java干货及时送达 System.currentTimeMillis的性能真有如此不堪吗&#xff1f; 最近我在研究一款中间件的源代码时&#xff0c;发现它获取当前时间不是通过System.currentTimeMillis&#xff0c;而是通过自定义的System.currentTimeMillis的缓存类&a…

高并发下System.currentTimeMillis()性能问题及优化方案

文章目录 背景System.currentTimeMillis()性能测试单线程测试多线程测试 原因优化优化代码单线程测试多线程测试 参考 背景 最近在看asyncTool源码发现了System.currentTimeMillis存在卡顿问题&#xff0c;所以就详细研究了下。具体如何呢&#xff1f;我们来看看 System.curr…

currentTimeMillis()方法

currentTimeMillis()方法返回一个long类型的值&#xff0c;该值表示的是当前时间与1970年1月1日0时0分0秒之间的时间差&#xff0c;单位是毫秒&#xff0c;习惯上被称为时间戳 源码&#xff1a; 时间戳可以用来计算循环操作时所需要的时间&#xff1a; /*** 向goods表中插入…

Java获取当前时区时间LocalDateTime与System.currentTimeMillis

Java获取当前时区时间 System.currentTimeMillisLocalDateTime最终结果 全球根据纬度不同&#xff0c;划分不同的时区。对于此时此刻&#xff0c;大家同处同一个时间点&#xff0c;但是&#xff0c;每个时区的时间表示是不同的。Java可以使用 System.currentTimeMillis和 Loc…

关于Java currentTimeMillis方法简述

刚刚接触JAVA时&#xff0c;为了便于记录某个方法块的执行时间&#xff0c;通常都会在代码块的执行前和执行后各标记一个时间&#xff0c;取两个时间差。 但是初学者一般只会选择用LocalDateTime来标记&#xff0c;然后用Duration.between来做差值。当然&#xff0c;Duration可…

System.currentTimeMillis()计算方式与时间的单位转换

一、时间的单位转换 1秒1000毫秒(ms) 1毫秒1&#xff0f;1,000秒(s) 1秒1,000,000 微秒(μs) 1微秒1&#xff0f;1,000,000秒(s) 1秒1,000,000,000 纳秒(ns) 1纳秒1&#xff0f;1,000,000,000秒(s) 1秒1,000,000,000,000 皮秒(ps) 1皮秒1&#xff0f;1,000,000,000,000秒(s) …

Java currentTimeMillis()方法介绍

一、官方文档 参考自Java SE 8官方文档&#xff1a; 方法功能&#xff1a;返回从1970年1月1日午夜&#xff08;UTC&#xff09;开始到当前时间的毫秒值. 其中&#xff0c;需要特别说明的地方 1.午夜(midnight)指的时间是 0时0分0秒&#xff0c;UTC表示该时间是0时区的时间…

Android中Intent和IntentFilter进行通信

文章目录 Intent启动不同组件的方法ActivityServiceBroadcastReceiver Data&#xff0c;Type属性与intent-filter配置指定Action调用系统的Activity启动Activity的标准Action常量以及对应的字符串标准的Category常量以及对应的字符串 实例一查看并获取联系人电话MainActivity代…

三、Intent 和 Intent过滤器(IntentFilter)

Intent&#xff08;意图&#xff09;&#xff1a; Intent 是一个消息传递对象&#xff0c;是我们要执行操作的一个抽象描述。我们可以使用它在相应的组件中传递消息和请求。下面是它的主要使用场景&#xff1a; 1. 启动Activity 通过 startActivity() 或者 startActivityForRes…

【Android】Intent 和 Intent Filter

一. Intent 简介 Intent 是一个消息传递对象&#xff0c;您可以用来从其他应用组件请求操作。可以用于&#xff1a;启动 Activity、启动服务、传递广播。 https://developer.android.com/guide/components/intents-filtershttps://developer.android.com/guide/components/i…

Android开发——IntentFilter的匹配规则

1. IntentFilter中的过滤信息 启动Activity分为显式调用和隐式调用&#xff0c;前者没什么好讲的&#xff0c;后者需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。包括action、category、data。 一个Activity中可以有多个IntentFilter&#xff0c;一个Intent…