Android进阶——Preference详解之初识Preference及Preference系(一)

引言

很久没来得及更新博客了,时间总是不够,以前的知识还没来得及总结完毕,新的知识又源源不断地接触到,工作也很忙,但还是没有忘记自己最低点目标每个月至少四篇。好了,废话就到这里啦,开始进入正文,这篇文章如标题所言,(准确地来说应该需要好几篇文章可能才能总结完毕吧)主题只有一个另一种构建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容器里
<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:key="first_preferencescreen">
    <CheckBoxPreference
            android:key="wifi enabled"
            android:title="WiFi" />
    <PreferenceScreen
            android:key="second_preferencescreen"
            android:title="WiFi settings">
        <CheckBoxPreference
                android: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,Activity,Preference,设置界面,首选项界面)