PreferenceFragment详解

PreferenceFragment详解在上篇文章中我们讲述的是 Android5 1Settings 的源码解析 http blog csdn net dongxianfei article details 其中在介绍到 Android 的 SubSetting 时 我们说到基本上都是使用的 PreferenceFr 技术 今天我们就来了解一下关于 PreferenceFr 相关的技术吧

在上篇文章中我们讲述了Android 5.1 Settings的源码解析Android 5.1 Settings模块源码分析_Flying snow-CSDN博客,

其中在介绍到Android的Sub Setting时,我们说到基本上都是使用的PreferenceFragment技术,今天我们就来了解一下关于PreferenceFragment相关的技术吧。

PreferenceFragment简述:

当我们在开发Android项目时一般都会用到首选项设置,在Android3.0之前我们都使用PreferenceActivity类来进行操作,这些设置习惯会被Preference自动保存下来,以便下次进入后恢复上一次的选择状态。

PreferenceActivity和普通的Activity不同,他们不使用setContentView加载布局,而是加载选项设置布局,而选择设置布局是以PreferenceScreen作为根元素的xml布局文件。

但在Android3.0之后Google不推荐我们使用PreferenceActivity来进行首选项设置,而是替换成了PreferenceFragment,其实二者的用法类似,只不过PreferenceFragment更容易扩展,所以推荐使用PreferenceFragment进行首选项设置。

PreferenceFragment是直接继承自Fragment,另选项布局xml文件的根节点一定是

,在这个元素中我们可以添加不同的Preference,常用的Preference控件如下:

CheckBoxPreference、SwitchPreference、EditTextPreference、ListPreference、MultiSelectListPreference、

PreferenceCategory等。

接下来我们将通过分析一个Demo来了解PreferenceFragment吧。

首先来看应用的主界面:

PreferenceFragment详解PreferenceFragment详解

以上为本次Demo的主界面,接下来将对每个选项的代码进行分析。

先建一个PrefFragment类继承自PreferenceFragment然后加载首选项配置的xml文件preferences.xml

public class PrefFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } //重写的以下方法请看后面讲解 @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if ("select_linkage".equals(preference.getKey())) { CheckBoxPreference checkBox = (CheckBoxPreference) findPreference("select_linkage"); ListPreference editBox = (ListPreference) findPreference("select_city"); editBox.setEnabled(checkBox.isChecked()); } return super.onPreferenceTreeClick(preferenceScreen, preference); } }

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefFragment()).commit(); } }

接下来将对preferences.xml文件进行分析,并使用效果图进行展示,先附上完整的xml代码:

 
   
   
    
    
     
    
    
    
     
    
    
    
     
     
     
     
     
      
     
    
    
    
     
      
      
     
    
    
    
     
     
    
  

 
   
   
    
   
   
   
    
  

PreferenceFragment详解

运行后,会在/data/data/ /shared_prefs/目录下生成对应的xml文件,用于存储设置的结果状态,

另可通getPreferenceManager().setSharedPreferenceName()方法来设置文件的名称。

所有的控件都需要合入android:key属性,不然无法保存结果状态,android:title是大标题,android:summary是小标题。

(2)我们接着往下分析:

 
   
   
    
    
    
    
    
     
    
  

这段代码中包含很多控件,其中EditTextPreference是文本框选项,可以用来手动输入文字,android:dialogTitle属性用来设置对话框的标题内容,点击的效果图如下:

PreferenceFragment详解

然后ListPreference是单选的列表选项,其中android:entries和android:entryValues需要指定数组作为值,

二者的区别在于android:entries中的值是供用户查看和选择的(即展示在界面上),

而android:entryValues的值是真正存储到手机中的值,我们在看下引入为entries和entryValues的值的cities数组。

 
   
   
    
    
      南京 
     
    
      北京 
     
    
      上海 
     
    
      杭州 
     
    
      合肥 
     
    
  

最后的运行效果图如下:

PreferenceFragment详解

接下来分析MultiSelectListPreference控件,这是一个多选的列表选项,和单选的唯一区别就是可以进行多项选择,

效果图如下:

PreferenceFragment详解

最后我们分析一下RingtonePreference和<PreferenceScreen>中的Intent,RingtonePreference是一个铃声选项,

可以加载手机中的铃声和短音,并做相应的处理。

<PreferenceScreen>中的Intent加载链接、拨打电话、发送短信等等,只要有对应的Intent的,都可以进行操作。

(3)我们在接着往下分析:

 
   
   
    
     
     
    
  

<PreferenceCategory>中包含一个<PreferenceScreen>,通过这样的关系可以打开一个新的页面,

并且里面同时包含两个CheckBoxPreference控件,其中android:defaultValue是设置默认是否选择,

效果图如下:

PreferenceFragment详解

这是一个新开的页面,里面只包含两个CheckBoxPreference控件,并且通过android:summaryOn

和android:summaryOff属性控制选择与否的差别。

(4)最后着重分析一下onPreferenceTreeClick()监听事件:

 
   
   
    
    
  

运行的效果图如下:

PreferenceFragment详解PreferenceFragment详解
 

当选中是否联动的CheckBoxPreference时,下面的ListPreference可使用,但当不选择CheckBoxPreference时,ListPreference将变成灰色无法被选中。

控制这段逻辑的代码在之前提到的Fragment中就已体现,这里单独拉出来分析一下:

@Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if ("select_linkage".equals(preference.getKey())) { CheckBoxPreference checkBox = (CheckBoxPreference) findPreference("select_linkage"); ListPreference editBox = (ListPreference) findPreference("select_city"); editBox.setEnabled(checkBox.isChecked()); } return super.onPreferenceTreeClick(preferenceScreen, preference); }

当任意的Preference控件被点击时,都会触发onPreferenceTreeClick这个方法回调,且通过preference.getKey()这个方法可以定位到哪个控件进行了操作,最终通过editBox.setEnabled(checkBox.isChecked());将CheckBox和ListPreference进行了绑定。

到这里PreferenceFragment的分析也就告一段落了,经过之前的分析大家也应该了解到这个类的优点在哪里,平时我们在做自己的项目时,遇到类似于这样的设置属性时,无需一个一个控件去慢慢布局了,而且那样处理逻辑时比这种方式复杂太多了。所以以后遇到类似的问题还是使用这种方式处理更加方便。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206322.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:58
下一篇 2026年3月19日 下午3:58


相关推荐

  • Python介绍和安装

    Python介绍和安装python介绍和安装1.Python简介Python是一种广泛使用的解释型、高级和通用的编程语言。Python支持多种编程范型,包括函数式、指令式、结构化、面向对象和反射式编程。它拥有动态类型

    2022年7月5日
    30
  • IDEA使用教程_intellij idea使用教程

    IDEA使用教程_intellij idea使用教程idea启动后会在cpan当前用户下生成一个C:\Users\Crystal.IntelliJIdea2018.1文件夹,这个文件夹里面有两个子文件夹config和system。删除这两个文件夹,idea在启动时候会重新配置。idea的project类似于eclipse的workspace;idea的modue类似于eclipse的project;配置都是在setti…

    2022年10月13日
    4
  • 数据结构图的构建_逻辑结构图的数据结构表示

    数据结构图的构建_逻辑结构图的数据结构表示图是一种很重要的数据结构,不解释。

    2022年4月19日
    67
  • java的二维数组讲解_javalambda表达式语法

    java的二维数组讲解_javalambda表达式语法1、二维数组概述1、二维数组其实就是一个特殊的一维数组,一维数组中每个元素就是一个一维数组2、三维数组又是一个特殊的二维数组2、二维数组的定义int[][]a=newint[10][10];String[][]b=newString[10][10];3、初始化二维数组//静态初始化int[][]a={{1,2,3,4},{4,5,6,7},{8,9,10,11}};//动态初始化

    2025年7月25日
    5
  • mac idea 激活码【最新永久激活】

    (mac idea 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S3…

    2022年3月26日
    1.2K
  • xshell评估期已过怎么办

    xshell评估期已过怎么办

    2021年10月17日
    114

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号