一 PreferenceActivity

1、PreferenceActivity概述

PreferenceActivity是一个抽象类,继承于ListActivity,以列表形式视图来展现界面,加载的整个View也是基于ListActivity中那个ListView的,其最主要的优势在于添加Preference后可让其状态持久化储存(通过SharedPreferences,一般存储在/data/data//shared_prefs文件夹下的默认名为“app package name”+”_preferences.xml”的文件里),比如说用户勾选CheckBox后退出应用,下一次进入到这一界面时候,对应的是CheckBox依然是被勾选状态,如果要实现这样的机制,我们自己也可以实现,但是没有必要,因为Android已经替我们实现了,就是我们的这一系列的主角——Preference,Preference会自动地替我们去保存这些状态对应的值到对应的SharedPreferences文件里,而当我们每次启动的时候Acitivity(PreferenceActivity)会自动根据key去获取相关数据,完成用户界面的更新。我们手机当中的系统设置就是及其典型的Preference的应用,也正是由于工作中需要去客制化Settings,才有了这一系列的文章。

SharedPreferences往往很容易被我们忽视两点

并非我们第一次打开相应界面之后就会自动创建对应的SharedPreferences文件,而是在我们改变了原有状态时候

并非所有的Preference及其子类都会创建,仅仅针对需要记录状态的Preference。

2、PreferenceActivity的初始化

PreferenceActivity其实和普通的Activity本质上来说区别不大,只不过多了些自动去读取SharedPrefrences的值来更新界面和其他一些逻辑,所以初始化本质上来说并无很大的区别,但是与普通Activity的layout不同,PreferenceActivity的layout我们可以理解成为两个部分:其他View和一个id为android.R.id.list的ListView,那么我们可以理解成为当我们在onCreate方法里先调用setContentView完成整个Activity的View的构建(layout文件里必须包含id为android.R.id.list的listView,否则会报E/AndroidRuntime: Caused by: Java.lang.RuntimeException: Your content must have a ListView whose id attribute is ‘android.R.id.list’),再调用addPreferencesFromResource来完成Preference界面的构建;当然也可以只调用addPreferencesFromResource方法。

1、继承PreferenceActivity实现具体业务类,重写相关生命周期方法

public class MainActivity extends PreferenceActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);addPreferencesFromResource(R.xml.demo_preference);}...
}

2、通过addPreferencesFromResource(xml资源id)加载静态xml资源文件 或者 完全通过代码构造对象再动态添加

在res文件夹下新建xml文件夹,再在xml文件中新建对应的xml资源,xml资源类似我们在使用普通Activity时的layout文件,PreferenceActivity独特之处在于并不是使用普通的layout文件,而是使用res下xml文件夹下的xml资源文件

res/xml/demo_preference.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<CheckBoxPreferenceandroid:key="key_checkbox_preference"android:summary="Some summay for CheckBoxPreference"android:title="The Title Of CheckBoxPreference" />
</PreferenceScreen>

也可通过代码去构造对象,添加容器之后再调用setPreferenceScreen(PreferenceScreen preferenceScreen)把容器对象设置到Activity上

private void createPreference(){PreferenceScreen preferenceScreen = this.getPreferenceManager().createPreferenceScreen(this);//先构建PreferenceScreen对象得到一个布局容器this.setPreferenceScreen(preferenceScreen);//设置容器CheckBoxPreference checkBoxPreference=new CheckBoxPreference(this);//构建一个子Preference,待添加到容器中checkBoxPreference.setKey(CHECKBOXPRERENCE_KEY);//设置keycheckBoxPreference.setTitle("The Title Of CheckBoxPreference");//设置titlecheckBoxPreference.setSummary("Some summay for CheckBoxPreference");preferenceScreen.addPreference(checkBoxPreference);//添加到容器中}

二 Preference的使用

前一篇文章我们讲述了Preference家族的基类(接下来我们所要介绍的其他子类Preference一定是继承了他的所有属性也可以理解成都是在继承他所展示的UI效果及交互功能的基础上升级的)而且Preference可以实例化,那么我们就可以把他看成对应的一个组件,其实和我们熟悉的TextView一样,所以我们需要使用的时候第一步肯定是先得到他的对象——而构造对象我们都可以通过两种方式:通过其对应的构造方法或者其他方法和通过xml映射(或许说法不够准确),接着第二步PreferenceActivity的初始化,再接着根据业务设置相关监听。

1、构造Preference容器和Preference对象

前面Android进阶——Preference详解之初识Preference及Preference系(一)已经讲过PreferenceScreen只能作为top-level节点,而构造对象我们都可以通过两种方式:通过其对应的构造方法或者其他方法和通过映射xml(或者讲法不够准确)。

res/xml/test_preference.xml

 <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="using_categories_in_root_screen"
android:summary="Using Preference Categories"
android:title="Categories">
<Preferenceandroid:key="key_prerence"android:title="Preferece"android:summary="Preference Demo"/>
</PreferenceScreen>

2、初始化PreferenceActivity和设置相关监听

常见的Preference的事件有两个:setOnPreferenceClickListener和onPreferenceChange

设置Preference点击监听

preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()      {@Overridepublic boolean onPreferenceClick(Preference preference) {//当接收到Click事件之后触发return true;}});

设置Preference对应的SharedPrefernces值监听

preference.setOnPreferenceChangeListener(new     Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {//如果值改变了我们可以通过监听这个事件来处理return true;}});@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//activity_main里必须存在id为android.R.id.list的ListView否则报E/AndroidRuntime:  Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'addPreferencesFromResource(R.xml.test_preference);mContext=getApplicationContext();preference=findPreference(PREFERENCE_KEY);preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {//如果值改变了我们可以通过监听这个事件来获取新值Toast.makeText(mContext, String.format("Preference的值为%s", newValue),Toast.LENGTH_LONG).show();return true;}});//设置Preference的点击事件监听preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {//当接收到Click事件之后触发Toast.makeText(mContext, "Preference Clicked",Toast.LENGTH_LONG).show();return true;}});
}

3、Preference的常用xml属性

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="PreferenceScreen">
<PreferenceCategory
android:key="key_prerence"
android:summary="Preference Categories Summary"
android:title="Preference Categories">
<CheckBoxPreferenceandroid:icon="@mipmap/ic_launcher"android:key="key_chkpreference"android:title="CheckBoxPreferenceCheckBoxPreferenceCheckBoxPreferenceCheckBoxPreference"android:summary="CheckboxPreference summary"/>
<Preferenceandroid:title="Preference"android:key="key_pre"android:icon="@mipmap/ic_red_launcher"android:layout="@layout/activity_main"/>
<EditTextPreferenceandroid:icon="@mipmap/ic_blue_launcher"android:key="key_edtkpreference"android:title="EditPreference"android:summary="EditPreference summary"/>
</PreferenceCategory></PreferenceScreen>

4、Preference的xml文件中的常用标签intent、extra

在xml文件的Preference标签中,我们可以添加intent来为我们快速实现一种意图,比如说快速打开一个网页,或者快速启动一个Activity等等,还可以使用extra给intent标签加参数来传递参数(再通过getIntent().getStringExtra(“key”)来获取)。

点击这个Preference则会自动去调用浏览器打开http://www.hao123.com网页

 <Preferenceandroid:title="Click me open the web"android:key="key_pref_intent"><intent android:action="android.intent.action.VIEW"android:data="http://www.hao123.com"/><!--可以通过<extra>传附加信息getIntent().getStringExtra("reused_key") --><extraandroid:name="key"android:value="value"/>
</Preference>

启动指定类

<Preferenceandroid:title="PREFERENCE TITLE"><!-- android:targetPackage是应用程序的包名,而android:targetClass的路径在子包下的类 --><!-- android:targetPackage设置为子包,运行时则找不到Activity --><intentandroid:action="ACTION_A_INTENT"android:targetPackage="com.crazy.training"android:targetClass="com.crazy.training.ui.MainActivity"></intent>
</Preference>

三、PreferenceScreen和PreferenceCategory

PreferenceScreen和PreferenceCategory没有新增的属性,所有属性全部继承自Preference。其中PreferenceScreen作为顶级容器,PreferenceCategory作为次级容器(类似于SQL Group by功能暂且这么理解吧),虽然他们也是可以单独使用的,但是并不能响应onPreferenceClick和onPreferenceChange事件。

布局和MainActivity的代码依然很简单和前面类似

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="PreferenceScreen">
<PreferenceCategory
android:key="key_prerence"
android:summary="Preference Categories Summary"
android:title="Preference Categories">
</PreferenceCategory>
</PreferenceScreen>

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="PreferenceScreen">
<PreferenceCategory
android:key="key_prerence"
android:summary="Preference Categories Summary"
android:title="Preference Categories">
<CheckBoxPreferenceandroid:icon="@mipmap/ic_launcher"android:key="key_chkpreference"android:title="CheckBoxPreference"android:summary="CheckboxPreference summary"/>
<EditTextPreferenceandroid:icon="@mipmap/ic_blue_launcher"android:key="key_edtkpreference"android:title="EditPreference"android:summary="EditPreference summary"/>
</PreferenceCategory>
</PreferenceScreen>![这里写图片描述](https://img-blog.csdn.net/20170416132536228?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR29vZ2xlX2h1Y2h1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

四、RingtonePreference的应用

RingtonePreference起作用就是供我们选择系统铃声的,除了Preference共有的属性外还新增了自己的几个独特属性。

应用也很简单,与Preference大同小异(注意看图)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="using_categories_in_root_screen"
android:summary="Using Preference Categories"
android:title="Categories">
<RingtonePreferenceandroid:key="key_prerence"android:title="RingPreferece Title"android:summary="RingPreference Summary"/></PreferenceScreen>

五、Preference的管理

Preference的管理主要包含Preference的创建、添加、移除和寻找特定Preference,Preference并没有直接提供相关替换的方法。

1、创建Preference

主要是通过各自对应Preference的构造方法或者直接在xml文件中定义来创建对应的Preference

2、addPreference添加Preference

添加只要是就是调用PreferenceGroup的addPreference(Preference preference)方法 来添加至容器PreferenceGroup。

3、findPreference寻找特定Preference

对于PreferenceActivity的findPreference(key)方法,我们只需要知道key值就可以找到同一xml文件下相应的Preference,勿需考虑层级和嵌套关系

4、removePreference或removeAll移除Preference

对于PreferenceGroup的removePreference(Preference preference)和removeAll()方法,都是针对某个PreferenceGroup来处理的,所以我们必须考虑层级嵌套关系,可以分为两步:先找到PreferenceGroup和要删除的Preference,再调用PreferenceGroup的removePreference执行删除动作。

首先这是我们的布局

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="key_manage_prefs">
<PreferenceCategoryandroid:key="key_category"android:title="PreferenceCategory"><EditTextPreferenceandroid:key="key_edtprefs"android:title="EditTextPreference" /><PreferenceScreenandroid:key="key_child_prefscreen"android:title="Child PreferenceScreen"><CheckBoxPreferenceandroid:key="key_checkbox"android:title="CheckBoxPreference" /></PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>

测试主体代码

public class MainActivity extends PreferenceActivity {private Context mContext;
private Preference preference;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.test_preference);//removePreferenceByKey();mContext=getApplicationContext();preference=findPreference("key_checkbox_child");//只要是同一个xml文件下的所有Preference都能通过key直接找到preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {Toast.makeText(mContext, String.format("Preference的值为%s", newValue),Toast.LENGTH_LONG).show();return true;}});preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {Toast.makeText(mContext, "Preference Clicked",Toast.LENGTH_LONG).show();//getFragmentManager().beginTransaction().replace(android.R.id.content,new MainFragment()).commit();return false;}});
}private void removePreferenceByKey(){/*PreferenceGroup preferenceGroup=(PreferenceGroup)findPreference("key_category");//先找到PreferenceGroupPreference preference=findPreference("key_edtprefs");//再找到要删除的Preference*//*(PreferenceGroup)findPreference("key_child_prefscreen").removePreference(findPreference("key_checkbox_child"));//执行删除key为key_checkbox_child的Preference**/getPreferenceScreen().removePreference(findPreference("key_category"));//删除掉key_category及对应节点下的所有节点//ERROR//getPreferenceScreen().removePreference(findPreference("key_edtprefs"));//无效,因为getPreferenceScreen获得的是当前的顶级容器,而key_edtprefs不是它的直接字节点((PreferenceGroup)findPreference("key_category")).removeAll();//仅删除掉key_category下对应Preference节点下的所有子节点
}

这篇文章主要介绍了Preference家族树中顶级成员和次级成员的应用和简单原理的说明,也基本把几乎所有相关的知识点都涉及了,Preference的基本语法都是一样的,区别在于各自不同的特性。

本文转自:http://blog.csdn.net/Google_huchun/article/details/70195114

android开发之PreferenceScreen使用详解相关推荐

  1. android中oncreate方法,android开发之onCreate( )方法详解

    这里我们只关注一句话:This is where you should do all of your normal static set up.其中我们只关注normal static, normal ...

  2. android开发之onCreate( )方法详解

    android开发之onCreate( )方法详解 onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Go ...

  3. Android开发之EditText属性详解+++ImageView的属性

    Button的使用 不要阴影Button ---> TextView   (5.0新特性) <!-- 去按钮立体效果 --> <item name="android: ...

  4. Android 开发之EditText属性详解

    EditText & TextView 属性详解: android:layout_gravity="center_vertical" 设置控件显示的位置:默认top. an ...

  5. android开发之Parcelable使用详解

    想要在两个activity之间传递对象,那么这个对象必须序列化,android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就可以了,不痛不痒.但是a ...

  6. Android开发之CoordinatorLayout使用详解一

    2019独角兽企业重金招聘Python工程师标准>>> 主页:http://cherylgood.cn/20170302/51 官网描述为:CoordinatorLayout是一个增 ...

  7. Android快速开发之appBase——(4).详解com.snicesoft.Application和BaseActivity

    转载请注明本文出自JFlex的博客http://blog.csdn.net/jflex/article/details/46441571,请尊重他人的辛勤劳动成果,谢谢! Android快速开发之ap ...

  8. android idata 模式,Android快速开发之appBase——(3).详解IHolder和IData

    Android快速开发之appBase--(3).详解IHolder和IData IHolder和IData是AVLib的两个组件,在前面已经使用过了,那么这一篇将会详细说明这两个组件的用法. IHo ...

  9. iOS开发之Accounts框架详解

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之Accounts框架详解 Accounts框架是iOS原生提供的一套账户管理框架,其支持Facebook,新浪微博 ...

  10. 安卓开发之IPC机制详解

    IPC(Inter-Process Communication),意为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程.前面在学习Handler机制时提到过线程与进程的概念,在安卓中一个进 ...

最新文章

  1. CNCF案例研究:奇虎360
  2. 世界最大的多语言语音数据集现已开源!超40万小时,共23种语言
  3. Fiddler保存http请求 常用sprirct
  4. 【LeetCode】87. Scramble String
  5. flutter-webview的坑用到第三方插件的
  6. 自动化部署shell01
  7. boost::gil::extend_boundary用法的测试程序
  8. python自动备份数据库_Python Mysql自动备份脚本
  9. owncloud8 php,owncloud-8.2.3
  10. 《JavaScript面向对象精要》——第1章 原始类型和引用类型 1.1 什么是类型
  11. HWUI(硬件加速绘制UI)简介
  12. 循序渐进之Spring AOP(5) - 创建切面
  13. 如何去除PDF的水印
  14. android+p+华为手机,Android P六大特性曝光支持刘海屏_华为 P20_手机新闻-中关村在线...
  15. 相位误差对SAR图像的影响
  16. 【风控模型】—WOE与IV指标的深入理解应用
  17. IBM power小型机HMC管理口默认IP地址和ASMI默认密码
  18. 对dz模板的一些注释
  19. 【小沐学Unity3d】Unity3d导入3D模型
  20. 2021SC@SDUSC BRPC代码分析(七) —— bthread综述、Butex及mutex详解

热门文章

  1. 怎么把音频转换文字?三个步骤解决它
  2. java转换投影坐标_GeoTools坐标转换(投影转换和仿射变换)
  3. JavaScript 3D 散点图
  4. oneday2mybatis下载
  5. html设置背景颜色以及透明度代码,HTML怎么设置背景颜色透明度?
  6. [资料] GIS资料汇总(GIS+Envi+erdas视频教程)
  7. 整好用版NI Circuit Design Suite Power Pro 11.0
  8. 读《About Face 4 交互设计精髓》16
  9. 2.4GHz频段天线的选择
  10. java生成uuid_Java UUID