引言

很久没来得及更新博客了,时间总是不够,以前的知识还没来得及总结完毕,新的知识又源源不断地接触到,工作也很忙,但还是没有忘记自己最低点目标每个月至少四篇。好了,废话就到这里啦,开始进入正文,这篇文章如标题所言,(准确地来说应该需要好几篇文章可能才能总结完毕吧)主题只有一个另一种构建UI的方式——通过Preference去构建UI,而不是直接通过layout方式(或许说得不够准确,因为Preference系也是间接通过Activity去展示的,只不过对于很多新人来说这种方式会和普通的有点不一样)

一、Preference家族概述

如下图所示Preference作为该家族的终极基类,直接继承Object,其他子类Preference直接或者间接继承于Preference。他们的作用就是定义要显示的UI(其实作用类似于普通的Layout布局文件),特殊之处在于定义好了UI之后再在PreferenceActivity里以ListView的形式整体布局,每一个子Preference相当于是一个列表项。另外Preference还提供了一个SharedPreference用于保存/读取数据,以其key属性作为SharedPreference的键。还有一点Preference所存储的数据最后都会以xml文件格式的形式进行保存,而且其只能 保存一些基本格式的数据。例如string/boolean等等。该xml文件存放的位置在data/data/你应用的包名/shared_prefs 文件夹下。

二、Preference重要的家族成员

1、Preference

1.1、重要的回调接口和方法

接口(方法) 说明
public static interface Preference.OnPreferenceChangeListener 当对应的首选项的值改变时触发该接口的回调
public static interface Preference.OnPreferenceClickListener 当点击Prefrence时触发该接口的回调
abstract boolean onPreferenceChange(Preference preference, Object newValue) OnPreferenceChangeListener接口里对应的回调方法
abstract boolean onPreferenceClick(Preference preference) OnPreferenceClickListener接口对应的回调方法

简单来说就是当我们点击或者首选项值改变时候会分别触发这两个方法。

1.2、重要的方法和属性

这些重要的公开方法或者接口都将被继承到其子类Preference下发挥重要的作用,所以又必要去眼熟下(我们都知道JavaBean中一般都是getter和setter成对出现的,为了节约篇幅就没有把所有的都列出来,还有父类的一些属性也没有全部列出,下同)

公共方法(属性) 说明
Preference(Context context, AttributeSet attrs, int defStyle)
Preference(Context context, AttributeSet attrs)
android:key key属性,可以唯一辨识同一容器内的Preference
android:title 标题
android:summary Preference里的第二行的描述说明位于title下
Context getContext() 获取当前的上下文对象
SharedPreferences.Editor getEditor() 获取对应的SharedPreferences的Editor对象
void setFragment() 设置要显示的Fragment
void setIcon(Drawable icon)/setIcon(int iconResId) 设置Preference的icon
void setIntent(Intent intent) 当点击Preference时执行startActivity(intent)里的intent对象
void setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener listener) 设置监听
void setOnPreferenceClickListener(Preference.OnPreferenceClickListener listener) 设置点击监听
void setSummary(int summaryResId)/setSummary(CharSequence summary) 设置summary
void setKey(String key) 设置对应的key
void setLayoutResource(int layoutResId) 设置Preference的布局
protected void onBindView(View view) 绑定数据
protected View onCreateView(ViewGroup parent) 建立Preference的布局类似Fragement里的
protected void onAttachedToActivity() 与附着的Activity对接时也是与Fragement里的类似
void notifyChanged() 当Preference里的值改变时候,可以手动调用这个方法去通知系统进行相关的更新,类似ListView里的

2、PreferenceGroup

PreferenceGroup是直接继承于Preference,起到的是一个容器作用,类似于ViewGroup的功能,我们在日常开发中接触最多的是他的子类 PreferenceCategoryPreferenceScreen,这两个直接继承PreferenceGroup所以在开发中起的作用也是容器,用于”安置“其他子Preference的容器。值得注意的是除了继承一些来自Preference及其他父类公共的方法还继承了一些公共属性。

公共方法(属性) 说明
PreferenceGroup(Context context, AttributeSet attrs, int defStyle)
PreferenceGroup(Context context, AttributeSet attrs)
void addItemFromInflater(Preference preference) 当Preference被添加到当前容器时被调用
Preference findPreference(CharSequence key) 通过key属性找到对应的Preference,同一容器内key应该唯一
int getPreferenceCount() 获取容器内Preference的数量
void removeAll() 删除所有容器内的Preference
boolean removePreference(Preference preference) 删除所有容器内的指定的Preference
boolean onPrepareAddPreference(Preference preference) 添加Preference之前执行

3、public final class PreferenceScreen

以上两个家族成员,我们在普通的开发中一般都是不会直接使用的,当人如果自定义Preference可能会涉及到,我们看到做多的应该是PreferenceScreenPreferenceCateGory,首先按照官网描述,PreferenceScreen在一个Preference的层级结构中是作为top-level顶级层次的,类似于普通布局中的各种Layout,LinearLayout、RelativeLayout等等,他继承于PreferenceGroup,所以同样起的容器的作用。同样的我们除了可以通过xml方式构造PreferenceScreen还可以通过createPreferenceScreen(Context)(后面文章再说具体用法)。

3.1、PreferenceScreen的功能

  • 作为一个PreferenceAcitivity的基本布局的根容器:和其他根Layout一样,是不可见的容器,只是把容器内的Preference呈现出来
  • 嵌套插入在其他PreferenceScreen容器里
<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"android:key="first_preferencescreen"><CheckBoxPreferenceandroid:key="wifi enabled"android:title="WiFi" /><PreferenceScreenandroid:key="second_preferencescreen"android:title="WiFi settings"><CheckBoxPreferenceandroid:key="prefer wifi"android:title="Prefer WiFi" />... other preferences here ...</PreferenceScreen>
</PreferenceScreen> 

3.2、重要的方法和属性

公共方法(属性) 说明
void bind(ListView listView) Binds a ListView to the preferences contained in this PreferenceScreen via getRootAdapter().
Dialog getDialog() Used to get a handle to the dialog.
ListAdapter getRootAdapter() Returns an adapter that can be attached to a PreferenceActivity or PreferenceFragment to show the preferences contained in this PreferenceScreen.
void onItemClick(AdapterView parent, View view, int position, long id)
void onDismiss(DialogInterface dialog) This method will be invoked when the dialog is dismissed.
protected void onClick() Processes a click on the preference.
protected ListAdapter onCreateRootAdapter() Creates the root adapter.
Parcelable onSaveInstanceState() Hook allowing a Preference to generate a representation of its internal state that can later be used to create a new instance with that same state.

4、public class PreferenceCategory

PreferenceCategory也是继承于PreferenceGroup,所以他也具有容器的功能,不过一般不用做顶级容器,可用于二级容器嵌套在PreferenceScreen里提供分组的作用,和数据库SQL中的group by差不多。

5、public abstract class DialogPreference

DialogPreference直接继承自Preference,它的独特之处在于它是基于Dialog的,也就是说但我们点击对应的DialogPreference系时是以Dialog形式展现的,又因它是一个abstract抽象类,所以更多的时候我们直接使用它的子类:EditTextPreferenceListPreferenceMultiSelectListPreference

DialogPreference系公共方法(属性) 说明
android:dialogIcon 对话框的icon
android:dialogLayout dialog 的contentView 布局
android:dialogMessage 对话框的内容
android:dialogTitle 对话框的标题
android:negativeButtonText 对话框里的按钮1名称
android:positiveButtonText 对话框里的按钮2名称
DialogPreference(Context context, AttributeSet attrs, int defStyle)
DialogPreference(Context context, AttributeSet attrs)
void onActivityDestroy() 当Activity destroy时触发
void onClick(DialogInterface dialog, int which) 对话框统一的回调方法,可以通过which来判断点击的是哪个按钮
void onDismiss(DialogInterface dialog) 但对话框消失时
一系列对应xml属性的setter和getter方法略…
protected void onBindDialogView(View view) 绑定数据
protected void onClick() 处理onClick事件
protected View onCreateDialogView() 建立Dialog的contentView
protected void onDialogClosed(boolean positiveResult) 当dialog 消失时,常被用于保存数据到SharedPreferences
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) 当Preference被点击前,dialog显示之前触发
protected void onRestoreInstanceState(Parcelable state) 恢复在onSaveInstanceState保存的数据
protected Parcelable onSaveInstanceState() 保存状态
protected void showDialog(Bundle state) 显示关联的dialog

5、public abstract class TwoStatePreference

TwoStatePreferenceDialogPreference同级,都是直接继承自Preference。TwoStatePreference如字面意思,是基于两种可选状态的首选项基类,在SharedPreferences里通过维护一个布尔值来设置当前状态的启用和禁止的一种Preference。

TwoStatePreference系公共方法 说明
TwoStatePreference(Context context, AttributeSet attrs, int defStyle)
TwoStatePreference(Context context, AttributeSet attrs)
TwoStatePreference(Context context)
CharSequence getSummaryOff() 获取当未check时显示的summary
CharSequence getSummaryOn() 获取checked时显示的summary
void setSummaryOff(CharSequence summary)/(int summaryResId)
void setSummaryOn(CharSequence summary)/(int summaryResId)
boolean isChecked()
void setChecked(boolean checked)
protected void onClick() 处理onclick
Object onGetDefaultValue(TypedArray a, int index) 当Preference的布局文件被映射和需要读取默认值时被调用
protected void onRestoreInstanceState(Parcelable state)
protected Parcelable onSaveInstanceState()
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) 设置首选项的初值

6、EditTextPreference、ListPreference和MultiSelectListPreference

作为DialogPreference的直接子类,这些子类Preference肯定拥有了DialogPreference的一切共性和特点,第一个肯定还是以Dialog的形式弹出,区别在于弹出的界面构成和其他的特性,这些在我们以后在开发中经常使用到,暂不详讲。

小结

这一篇也是Preference的基本知识,主要是为了对于Preference家族的基本构成体系和基本特点概念有所了解,下几篇文章再针对各子类的应用及后面的自定义Preference和扩展系统Preference做详细总结。

Android进阶——Preference详解之初识Preference及Preference系(一)相关推荐

  1. Android Preference详解之初识Preference及Preference系(一)

    Android Preference详解之初识Preference及Preference系(一) 转载:https://blog.csdn.net/google_huchun/article/deta ...

  2. Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)

    文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...

  3. Android Preference详解之初识Preference及Preference系(一)

    一种构建UI的方式--通过Preference去构建UI,而不是直接通过layout方式(或许说得不够准确,因为Preference系也是间接通过Activity去展示的,只不过对于很多新人来说这种方 ...

  4. Android进阶——AIDL详解

    看这篇之前先看看binder: Android--Binder机制. 1. 简介 AIDL(Android 接口定义语言),可以使用它定义客户端与服务端进程间通信(IPC)的编程接口,在 Androi ...

  5. android preference属性,Android进阶——Preference详解之Preference系的基本应用和管理(二)...

    并非我们第一次打开相应界面之后就会自动创建对应的SharedPreferences文件,而是在我们改变了原有状态时候喎�"/kf/ware/vc/" target="_b ...

  6. [Android]多进程知识点详解

    作者:Android开发_Hua 链接:https://www.jianshu.com/p/e0f833151f66 多进程知识点汇总: 一:了解多进程 二:项目中多进程的实现 三:多进程的优缺点与使 ...

  7. Android进阶——Preference详解之Preference系的基本应用(三)

    引言 前面一篇文章Android进阶--Preference详解之Preference系的基本应用和管理(二)介绍了二级Preference的使用和特点,接下来进入系统给我提供的底级Preferenc ...

  8. Android自定义View进阶-MotionEvent详解

    欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录 我们微信公众号:杨守乐 推荐文章: 如果你喜欢上了一个程序员小伙,献给所有的程序员女友 学习资料(干货汇集)不断更新 ...

  9. Android自定义控件进阶13-MotionEvent详解

    Android MotionEvent 详解,之前用了两篇文章 事件分发机制原理 和 事件分发机制详解 来讲解事件分发,而作为事件分发主角之一的 MotionEvent 并没有过多的说明,本文就带大家 ...

最新文章

  1. premiere pr 波纹编辑 滚动编辑 比率拉伸 工具使用
  2. 高和父元素的高一致_首次:低温熔盐法合成菊花状三维高熵硼化物纳米花 (华南理工大学褚衍辉课题组最新研究成果)...
  3. 怎么查看有关cas的报错_Linux LVM I/O报错,你也遇到这样的问题吗?
  4. Apache ECharts顺利毕业,成为ASF顶级项目
  5. 在实践中重试HTTP标头
  6. 为何加入了AddType就无法启动Apache
  7. php web教程视频教程下载,Web全栈 PHP+React系列视频教程下载
  8. AR-关于几种特殊的收款方式说明
  9. 修复Oracle9i中DBA的密码
  10. url、href、src
  11. iphone safari不支持position fixed的解决办法
  12. 使用python批量验证邮箱密码_python(Django 网页登陆账号、密码、邮箱验证)
  13. 加密--HashPasswordForStoringInConfigFile过时问题
  14. 【预测模型】基于粒子群算法优化最小二乘支持向量机lssvm实现预测matlab源码
  15. ArcGis批量裁剪栅格图层
  16. 《药物设计学》单词表
  17. 2016.06工作日志
  18. java aspose.words 生成word目录和更新目录
  19. halcon绘制多边形轮廓的方法
  20. 水瓶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. [原创] 爱的心情  (散文诗)
  2. 软件构造Chapter6 Review
  3. css选择器—四大基本选择器
  4. a标签跳转在新的窗口打开设置
  5. java获取一个tcp包大小_Java网络编程之TCP粘包拆包
  6. python生成excel文件的三种方式
  7. 有关于contiguous()的含义
  8. 自定义Tomcat启动脚本
  9. 如何使用纯CSS实现固定宽高比div?
  10. face++API接口实现颜值测试