Android 首选项框架及PreferenceScreen,PreferenceActivity,PreferenceFragment的用法与分析
前言
《Android 4 高级编程(第3版)》第7章第5节讲到了首选项框架和PreferenceActivity概述等内容,因为第一次见到PreferenceScreen,还没用过,所以心情难免有点小激动。那google官方为什么要出这么个东东,它又有什么好处呢?让我们带着这些个问题,一起去进行探索吧!
提纲
这篇文章我们会从以下几个知识点进行学习:
- PreferenceScreen
- Preference
- PreferenceActivity
- PreferenceFragment
正文
Preference
它相当于一个View,在xml中由它的子类节点来展示相应的控件
CheckBoxPreference:类似CheckBox,
ListPreference:这个类是继承自DialogPreference,当点击它时,它会弹出Dialog来展示数据,比如:城市选择
SwitchPreference:是一个内含有2种状态的ToggleButton的控件
EditTextPreference:继承自DialogPreference,里面持有EditText输入框,与ListPreference一样,以对话框呈现。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"/><!-- <!–也可以直接用intent跳转到指定Activity–><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的用法与分析相关推荐
- 详解Android首选项框架ListPreference
探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写一个应用程序,它提供了一个搜索飞机航班的工具.而且,假设该应用程序的 ...
- android 首选项框架,Android:创建自定义首选项
婷婷同学_ 这就是我使用支持库的方法preference-v7.扩展 Preference和覆盖onBindViewHolder().此方法使您可以通过ViewHolder对象获取对首选项视图的引用. ...
- 如何在“首选项”摘要中显示Android首选项的当前值?
这必须经常出现. 当用户在Android应用程序中编辑首选项时,我希望他们能够在Preference摘要中查看首选项的当前设置值. 示例:如果我有"丢弃旧邮件"的"首选项 ...
- (最新最详细)eclipse的preferences下没有Android首选项?
首先说一下为什么eclipse的preferences里面没有Android选项,这是因为没有在eclipse里面安装我们的ADT,所以就没有我们的Android选项.安装ADT即可出现我们的Andr ...
- Android 中选项菜单(Option menu)的用法
博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
- Android中Preference,preferenceActivity,PreferenceFragment等的使用
本文转自android 官方翻译过来的文本: 这里的话,只谈几个需要注意的问题: (1)这篇文章中也谈到的: 您必须将 XML 文件保存在 res/xml/ 目录中.尽管您可以随意命名该文件,但它通常 ...
- android listpreference 自定义,Android中Fragmen首选项使用自定义的ListPreference的方法
首选项这个名词对于熟悉Android的朋友们一定不会感到陌生,它经常用来设置软件的运行参数. Android提供了一种健壮并且灵活的框架来处理首选项.它提供了简单的API来隐藏首选项的读取和持久化,并 ...
- android实例教程_Android共享首选项示例教程
android实例教程 In this tutorial we'll use Shared Preferences in our android application to store data i ...
- android 类对象的存储,android - 以共享首选项存储和检索类对象
android - 以共享首选项存储和检索类对象 在Android中,我们可以在共享首选项中存储类的对象,并在以后检索该对象吗? 如果有可能怎么办? 如果不可能做到这一点的其他可能性是什么? 我知道序 ...
最新文章
- 天哪!我的十一假期被AI操控了
- Windows server2012虚拟机 密码重置
- windows下安装各个版本memcache扩展
- 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
- lsof 详解 (转载)
- Dubbo调用时报错Invalid token Forbid invoke remote service interface
- 关于 数据库 my_slq的 安装及其卸载
- #winhec# 开发人员刷屏看点 (视频)
- !/usr/bin/env python和!/usr/bin/python的区别
- Java 开发必备,EasyExcel 操作详解!
- Hadoop工程包架构解析
- (一)DSP28335
- DirectX修复工具
- 2016年考研数学一解析 ​​​
- Android 跳转外部浏览器
- 服务器受到DDOS攻击怎么办
- easyExcel导出下拉选择框,多sheet数据excle导入导出
- Win10如何删除输入法(删除默认输入法)
- AAAI论文摘要【知识图谱补全】:A Survey on knowledge Graphs:Representation,Acquisition and Application
- 测试脉冲电磁对于铝片和铜片的影响
热门文章
- 怎样才能不掉线使炫舞
- ABAP 锁对象与加锁机制(程序锁)
- 【Effection C++】读书笔记 条款20~条款23
- mysql 替换所有字母_mysql如何替换掉字母
- 不同设计风格的咖啡厅,经营模式有什么区别?
- VC2010中显示行号
- 【养生】实用穴位疗法
- 23.支持向量机的使用
- FPU/VFP/ASE/NEON/MPE/SVE/MVE分别都是什么意思?
- 解决windows10下无法安装.net framework 3.5,错误代码0x8024401C