前言

《Android 4 高级编程(第3版)》第7章第5节讲到了首选项框架和PreferenceActivity概述等内容,因为第一次见到PreferenceScreen,还没用过,所以心情难免有点小激动。那google官方为什么要出这么个东东,它又有什么好处呢?让我们带着这些个问题,一起去进行探索吧!

提纲

这篇文章我们会从以下几个知识点进行学习:

  1. PreferenceScreen
  2. Preference
  3. PreferenceActivity
  4. PreferenceFragment

正文

  1. Preference

    它相当于一个View,在xml中由它的子类节点来展示相应的控件
    CheckBoxPreference:类似CheckBox,
    ListPreference:这个类是继承自DialogPreference,当点击它时,它会弹出Dialog来展示数据,比如:城市选择
    SwitchPreference:是一个内含有2种状态的ToggleButton的控件
    EditTextPreference:继承自DialogPreference,里面持有EditText输入框,与ListPreference一样,以对话框呈现。

  2. PreferenceScreen

    官方源码给出的注释的意思大概如下:
    这是一个代表包装一系列Preference视图树的一个根节点。在xml中PreferenceScreen可以出现在2个地方:根节点Preference视图树中间
    A),当做为根节点时,PreferenceScreen不会显示,即只在当前一屏;
    B),当在视图层级中间时,代表是一个新的屏幕,当点击它时,会另开一屏

    下面是一个简单的xml布局文件,包含了PreferenceScreen,Preference
    注:Preference的xml文件放在res/xml文件夹下,没有xml文件夹时,自己创建

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><Preference
        android:key="title"android:layout="@layout/item_titlebar" /><PreferenceCategory
        android:title="性别"><CheckBoxPreference
            android:key="preference_sex_man"android:title="男"/><CheckBoxPreference
            android:key="preference_sex_woman"android:title="女"/><SwitchPreference
            android:key="switch"android:title="wifi"/><PreferenceScreen
            android:key="wifisetting"android:title="WifiSetting"><SwitchPreference
                android:key="sencond_preferencScreen"android:title="SencondPreference"/><!-- &lt;!&ndash;也可以直接用intent跳转到指定Activity&ndash;&gt;<intentandroid:action="android.intent.action.VIEW"android:data="http://www.baidu.com"></intent>--></PreferenceScreen></PreferenceCategory><PreferenceCategory
        android:title="城市选择"><ListPreference
            android:key="city_choose"android:title="城市选择"android:summary="点击进行城市选择"android:entries="@array/cities_name"android:entryValues="@array/cities_name"></ListPreference></PreferenceCategory><PreferenceCategory
        android:title="昵称"><EditTextPreference
            android:key="nickName_edit"android:title="修改昵称"android:summary="点击进行昵称修改"android:dialogTitle="修改昵称"android:dialogMessage="确认修改?"></EditTextPreference></PreferenceCategory></PreferenceScreen>

这个布局文件对应的UI如下:

3.PreferenceActivity与PreferenceFragment

在Android1.0的时候,官方就有了PreferenceActivity,这个类继承自ListActivity,是一个抽象类,其持有PreferenceManager对象的引用。在Android3.0时,由于Fragment的出现,官方同步支持了PreferenceFragment,同时,PreferenceActivity中的一些API也被相应标记为过时,官方给出的解释是:因为PreferenceActivity这个类仅仅只被允许展示一个单独的偏好设置,而这些现在都能在PreferenceFragment中找到了,其实从中可以看出google官方的思想是用碎片化来达到解藕

eg:
新建一个Activity,继承自PreferenceActivity,

/*** Created by sunny on 2016/1/5.* 首选项设置,*/
public class TestPrefeerenceActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener, SharedPreferences.OnSharedPreferenceChangeListener {public static final String TAG = TestPrefeerenceActivity.class.getSimpleName();private SharedPreferences mSharePreference;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//注意:这里不再用setContentView,改用addPreferencesFromResource(),//setContentView(R.layout.activity_test_preference);addPreferencesFromResource(R.xml.test_preference);mSharePreference = PreferenceManager.getDefaultSharedPreferences(this);
//由PreferenceManager获取SharedPreferences对象的引用initView();bindView();}@Overrideprotected void onResume() {super.onResume();freshUI();mSharePreference.registerOnSharedPreferenceChangeListener(this);}private void freshUI() {mListPreference.setTitle(mSharePreference.getString("city_choose","null"));mEditPreference.setTitle(mSharePreference.getString("nickName_edit","null"));}

下面是获取Preference控件实例的方法,与findViewById()相似:

   private void initView() {mTitleBar = findPreference("title");
//这里的title是一个key,也即SharePreference中用来存储数据的key.mListPreference = (ListPreference) findPreference("city_choose");mCBPreferenceMan = (CheckBoxPreference) findPreference("preference_sex_man");mCBPreferenceWoman = (CheckBoxPreference) findPreference("preference_sex_woman");mEditPreference = (EditTextPreference) findPreference("nickName_edit");}

最后实现onPreferenceChange监听

    @Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {if (preference instanceof EditTextPreference) {mEditPreference.setTitle(newValue.toString());mEditPreference.setText(newValue.toString());mEditPreference.setDefaultValue(newValue);} else if (preference instanceof ListPreference) {mListPreference.setValue(newValue.toString());mListPreference.setTitle(newValue.toString());} else if (preference instanceof CheckBoxPreference) {changeCBState(preference);}return false;}private void changeCBState(Preference preference) {if (preference == mCBPreferenceMan) {checkCheckBoxPreference(preference, mCBPreferenceWoman);} else {checkCheckBoxPreference(preference, mCBPreferenceMan);}}

实例

demo:github地址SunnyDemoProject/sunnydemo2

总结

现在由于APP的高度定制化,除了系统的设置界面,第三方的应用几乎都没有用到PreferenceActivity或PreferenceFragment,
不过从中可以学到google的一种封装思想,界面与Preference分离,
然后通过PreferenceManager来连接界面与Preference,实现SharePreference对数据进行存储与读取,做到解藕。

Android 首选项框架及PreferenceScreen,PreferenceActivity,PreferenceFragment的用法与分析相关推荐

  1. 详解Android首选项框架ListPreference

    探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写一个应用程序,它提供了一个搜索飞机航班的工具.而且,假设该应用程序的 ...

  2. android 首选项框架,Android:创建自定义首选项

    婷婷同学_ 这就是我使用支持库的方法preference-v7.扩展 Preference和覆盖onBindViewHolder().此方法使您可以通过ViewHolder对象获取对首选项视图的引用. ...

  3. 如何在“首选项”摘要中显示Android首选项的当前值?

    这必须经常出现. 当用户在Android应用程序中编辑首选项时,我希望他们能够在Preference摘要中查看首选项的当前设置值. 示例:如果我有"丢弃旧邮件"的"首选项 ...

  4. (最新最详细)eclipse的preferences下没有Android首选项?

    首先说一下为什么eclipse的preferences里面没有Android选项,这是因为没有在eclipse里面安装我们的ADT,所以就没有我们的Android选项.安装ADT即可出现我们的Andr ...

  5. Android 中选项菜单(Option menu)的用法

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,

  6. Android中Preference,preferenceActivity,PreferenceFragment等的使用

    本文转自android 官方翻译过来的文本: 这里的话,只谈几个需要注意的问题: (1)这篇文章中也谈到的: 您必须将 XML 文件保存在 res/xml/ 目录中.尽管您可以随意命名该文件,但它通常 ...

  7. android listpreference 自定义,Android中Fragmen首选项使用自定义的ListPreference的方法

    首选项这个名词对于熟悉Android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数. Android提供了一种健壮并且灵活的框架来处理首选项.它提供了简单的API来隐藏首选项的读取和持久化,并 ...

  8. android实例教程_Android共享首选项示例教程

    android实例教程 In this tutorial we'll use Shared Preferences in our android application to store data i ...

  9. android 类对象的存储,android - 以共享首选项存储和检索类对象

    android - 以共享首选项存储和检索类对象 在Android中,我们可以在共享首选项中存储类的对象,并在以后检索该对象吗? 如果有可能怎么办? 如果不可能做到这一点的其他可能性是什么? 我知道序 ...

最新文章

  1. 天哪!我的十一假期被AI操控了
  2. Windows server2012虚拟机 密码重置
  3. windows下安装各个版本memcache扩展
  4. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
  5. lsof 详解 (转载)
  6. Dubbo调用时报错Invalid token Forbid invoke remote service interface
  7. 关于 数据库 my_slq的 安装及其卸载
  8. #winhec# 开发人员刷屏看点 (视频)
  9. !/usr/bin/env python和!/usr/bin/python的区别
  10. Java 开发必备,EasyExcel 操作详解!
  11. Hadoop工程包架构解析
  12. (一)DSP28335
  13. DirectX修复工具
  14. 2016年考研数学一解析 ​​​
  15. Android 跳转外部浏览器
  16. 服务器受到DDOS攻击怎么办
  17. easyExcel导出下拉选择框,多sheet数据excle导入导出
  18. Win10如何删除输入法(删除默认输入法)
  19. AAAI论文摘要【知识图谱补全】:A Survey on knowledge Graphs:Representation,Acquisition and Application
  20. 测试脉冲电磁对于铝片和铜片的影响

热门文章

  1. 怎样才能不掉线使炫舞
  2. ABAP 锁对象与加锁机制(程序锁)
  3. 【Effection C++】读书笔记 条款20~条款23
  4. mysql 替换所有字母_mysql如何替换掉字母
  5. 不同设计风格的咖啡厅,经营模式有什么区别?
  6. VC2010中显示行号
  7. 【养生】实用穴位疗法
  8. 23.支持向量机的使用
  9. FPU/VFP/ASE/NEON/MPE/SVE/MVE分别都是什么意思?
  10. 解决windows10下无法安装.net framework 3.5,错误代码0x8024401C