android preference介绍

来源:互联网 发布:中万网络销售 编辑:程序博客网 时间:2024/04/30 01:03

android preference

 

 

 

       向用户提供一些参数设置的接口,可以使用preferences相关的一些类,就可以很方便的呈现参数设置界面及对参数的设置进行处理。

       参数的配置可以通过xml文件配置也可以在代码种编码配置。本文先介绍参数配置的元素,然后介绍在xml文件种配置参数的方法,最后介绍代码种的配置方法及在代码中如何使用这些配置参数。

 

一、参数界面元素

1、PreferenceScreen

相当于一个参数页面。图1所示即为参数页面的一部分。在一个参数页中可以嵌入一个或多个不同的PreferenceScreen,这个参数页也可以是启动其它的页面如activity页面。

 

2、PreferenceCategory

参数域,可以将一系列的参数归到同一个范围内,表示同类或近似功能的参数。一个参数页面中可以包含多个参数域。参数域可以加说明标题。图1中红色区域所示即为一个参数域。

 

3、某个参数的呈现和编辑,有如下几种可选模式

EditTextPreference:

可编辑参数内容的对话框。

 

ListPreference:

以列表来呈现参数内容并提供选择参数操作的对话框。

 

CheckBoxPreference:

参数勾选框。常用于使能开关。见图1中红色区域外。

 

Preference及其子类:

可以从Preference派生出我们自定义的参数页面,改页面可以嵌入到普通的参数页面中,然后点击参数页面的对应项可以启动并呈现该参数页面。

图1 参数页面(整个区域)

 

图2 EditTextPreference(左)、ListPreference(右)

      

       在以上两个参数编辑设置界面中,均可以设置属性标题和说明文字,以及标题文字。而对于ListPreference,可以设置其显示的列表内容,该内容可以在array.xml中定义。

 

 

二、在xml文件中配置参数界面元素

1、配置参数页父标签:

       使用一个PreferenceScreen标签标识一个参数页,一个参数页中也可以嵌入多个参数页。

 

2、一个参数页面中的参数域的配置不是必须的,可按需配置,如下:

       使用一个PreferenceCategory来配置一个参数域。可以给参数域指定标题。

 

3、可编辑参数内容的参数配置

       对于某一个参数项,需要编辑该参数内容时,可以使用一个EditTextPreference参数,该参数被点击的时候会弹出一个编辑参数内容的对话框,如图2中左图所示。配置如下:

说明:

       android:key:参数项索引,供查找该参数项使用;

       android:title:参数项在参数页中所显示的标题;

       android:summary:参数项的概括说明;

       android:dialogTitle:所弹出的参数内容编辑对话框的标题。

 

4、可选择参数内容的参数配置

       对于某一个参数项,若需要提供多个可选项供选择,可以使用ListPreference,它在被点击之后,会使用一个对话框,在其中以列表的形式来呈现可选参数值,如图2中有右图所示。配置如下:

说明:

       android:key:参数项索引,供查找该参数项使用;

       android:title:参数项在参数页中所显示的标题;

       android:summary:参数项的概括说明;

android:entries:定义了显示在界面上的参数项标题,通常在array.xml中配置;

android:entryValues:参数列表中参数项的变量名,数据操作时使用,对应到entries。

       android:dialogTitle:所弹出的参数内容编辑对话框的标题。

 

以上所涉及的资源数组定义举例如下:

 

5、勾选框参数项CheckBoxPreference

       这种参数项相当于一个参数开关,只有打开和关闭两种状态。    效果如下:

 

配置如下:

       也可以使用下面的这种模式:

说明:

       android:persistent:参数值需要永久保存时使用

       android:summaryOn:参数项选中状态下的概括说明;

       android:summaryOff:参数项没有选中的状态下的概括说明;

       其它的标签项的作用可参看前面的说明。

 

6、子参数页

       前面说过,在一个参数页种可嵌入一个或多个参数页,称之为子参数页,使用的标签也是PreferenceScreen。子参数页的参数项,在点击的时候可以启动另外一个参数页,也可以启动指定的activity。配置示例如下:

(1)、使用intent启动的子参数页

说明:

intent:配置Intent的内容,用于启动呈现子参数页内容的一个activity,可以添加Intent可以支持的多个域,如android:data等;

其它标签参看前面说明。

 

(2)、直接配置子参数页,点击直接呈现该参数页内容

       这种配置没有通过intent去启动其他的activity来呈现参数内容,而是点击该参数项后,直接将子参数页的内容显示出来。在子参数页种,可以配置多个各式各样的参数。示例:

 

7、自定义参数项Preference

       有时为了参数项在操作时能够体现一些自定义的功能,可以自定义参数项,也即从Preference派生子类。

public class Preference implements Comparable<Preference>, OnDependencyChangeListener

       如何自定义Preference呢?

(1)、创建参数布局文件,这个布局可以不采用系统中已有的参数项,可以使用一些普通的视图类;

(2)、初始化

初始化可以在构造函数调用的时候进行,调用如下的方法将(1)中所设的布局设置好。

Preference.setWidgetLayoutResource(int widgetLayoutResId)

注意:该方法所添加的自定义preference的布局大小被限定为ListView的条目项的尺寸。

Preference.setLayoutResource (int widgetLayoutResId)

注意:该方法所添加的自定义preference的布局大小不会被限定为ListView的条目项的尺寸,而是使用自定义preference布局自身所需要的尺寸。

 

该方法将为该Preference的可控窗口区域设置布局,这个布局会被展开到主布局中。

(3)、绑定数据到所创建好的view中

       创建自定义参数项来显示所需要的数据,要将这些数据绑定到从(1)、(2)中所创建的视图类之上,并为相应的视图设置属性,重载如下函数,实现该功能。

Preference.onBindView(View view)

参数:

View view:指向(1)、(2)中所用的布局的视图树的根视图,该视图树中的子视图可以通过view.findViewById(int id)获得。

(4)、事件处理

       重载如下方法实现界面事件的处理:

Preference.onClick()

重载该方法,可以保存参数值到SharedPreferences中,但是最好是通过调用Preference.callChangeListener(Object newValue)来确保用户想使用新的值来更新参数。callChangeListener允许忽略新的参数值。

为了保存新的参数值,需要调用Preference.persistInt(int value),该方法将参数值保存到了SharedPreferences中。

最后,调用notifyChanged()通知UI更新数据。

 

(5)、参数获取、设置

重载如下方法供初始化回调:

ü Preference.onSetInitialValue(boolean restoreValue, Object defaultValue)

参数:

boolean restoreValue:为真,表示使用存储值,需要从SharedPreferences中读取参数值;否则,使用默认值defaultValue。

ü Preference.onSaveInstanceState()

回调,供Preference产生一个内部状态的描述,这个描述可以在以后用于创建一个具有相同状态的实例。注意,这些状态必须是那些非永久(not persistent)的状态值或者可以被重构的。

ü Preference.onRestoreInstanceState(Parcelable state)

回调,供使用已保存的状态来恢复状态值使用。恢复了状态值后调用notifyChanged()通知UI更新数据。

参数:先前由onSaveInstanceState()所保存并返回的状态值。

ü Preference.onGetDefaultValue(TypedArray a, int index)

回调,在展开参数项时需要获得默认值的属性时调用。

参数:

TypedArray a:属性数组;

int index:默认值的属性索引。

 

以上所涉及到的状态,可以使用BaseSavedState来表述,还可以派生子类实现。

 

8、参数的依赖关系

       参数设置中,有一些参数的设置是依赖于其它的参数的,比如wifi使能和设置两个参数项,wifi的设置必须等wifi的打开设置了之后才能够进行。那如何表示参数间的依赖关系呢?

       使用android:dependency="dependt_who"标签来表示依赖关系。而android:layout="?android:attr/preferenceLayoutChild"表示使用的是一个系统定义的布局,preferenceLayoutChild属性在系统文件cupcake\frameworks\base\core\res\res\values\attr.xml中声明,在cupcake\frameworks\base\core\res\res\values\styles.xml中定义。

 

 

三、相关的类及常用方法

       在以上介绍的参数的xml配置中所使用到的一些参数标签,其实都是一些系统中实现好的类,他们负责参数的呈现及相关操作,所以,我们也可以在代码中创建参数元素并进行配置。

 

首先看一下几个相关的类及常用方法。

 

1、使用PreferenceActivity

public abstract class PreferenceActivity extends ListActivity implements

        PreferenceManager.OnPreferenceTreeClickListener

       该类为抽象类,使用时从该类派生子类,既可以实现参数的管理。该类使用的是一个ListView的布局来呈现内容。

       该类拥有一个PreferenceManager实例,用于从activity或者xml文件创建参数树。

 

2、参数管理器PreferenceManager

       这个类用来帮组从activity或者xml文件创建参数树。

该类拥有一个SharedPreferences实例,这个实例指向了一些由他管理的包含了这些参数值的文件。同时,也拥有一个SharedPreferences.Editor实例,该实例从SharedPreferences实例中获得,具有获取和修改参数值的功能。

 

3、几个常用的方法

ü PreferenceActivity.setPreferenceScreen(PreferenceScreen preferenceScreen)

作用:设置要显示的参数树的根,也即最上层的那个参数页。

返回值:无。

ü PreferenceActivity.getPreferenceScreen()

作用:获得这个activity所显示的参数树的根。

返回值:PreferenceScreen句柄。

 

ü PreferenceActivity.addPreferencesFromIntent(Intent intent)

作用:添加来自于activity的匹配给定Intentt的参数。

返回值:无。

该方法的用法?????

 

ü PreferenceActivity.addPreferencesFromResource(int preferencesResId)

作用:展开给定的xml资源文件并将其中的参数树添加到当前的参数树中。

返回值:无。

 

ü PreferenceActivity.onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)

作用:派生子类时重载该函数,以实现参数项点击时的操作。

返回值:boolean。

 

ü PreferenceActivity.findPreference(CharSequence key)

作用:获取指定关键字的参数项。每一个参数项在配置的时候,指定了一个key值,由该值可以匹配到对应的参数项。

返回值:Preference对象。

 

ü PreferenceManager.getDefaultSharedPreferences(Context context)

作用:静态方法,获取一个SharedPreferences实例,该实例指向了在给定的context中被preference所使用的文件,这些文件保存了参数的信息。获得了SharedPreferences对象之后调用SharedPreferences.edit()可以获得一个Editor,通过Editor可以对参数值进行读取和修改。

返回值:SharedPreferences对象。

 

ü PreferenceManager.createPreferenceScreen(Context context)

作用:为指定的context创建一个PreferenceScreen实例并返回。使用这个实例可以从代码中手动的添加参数树。

返回值:PreferenceScreen对象。

 

 

四、如何加载参数

加载参数树有两种模式,一是从xml文件导出,二是在代码中手动添加。

 

1、从xml文件导出

       参数树在xml文件中如何配置,参看(二)中所述。配置参数的xml文件可以放在工程目录的res/xml中。

       借助于PreferenceActivity,从它派生子类,并实现Preference.OnPreferenceChangeListener接口。在子类的onCreate方法中,通过调用:

PreferenceActivity.addPreferencesFromResource(int preferencesResId)从指定的参数资源文件中导出参数树。这个参数树由父类PreferenceActivity管理,使用起来很方便。

通过调用:

PreferenceActivity.getPreferenceScreen()可以获得导出的参数树的根对象。

调用PreferenceActivity.findPreference(CharSequence key)可获得指定名字的参数项。

 

2、使用代码手动添加

从PreferenceActivity派生一个子类,在该子类的onCreate方法中手动添加参数树。

(1)、获得参数树的根Preference;

getPreferenceManager().createPreferenceScreen(context).

 

(2)、按参数树的层级关系,创建参数元素,并添加到参数树的对应位置中。

添加使用到方法:PreferenceGroup.addPreference(Preference preference)。参数元素的类级别关系如下:

PreferenceGroup及其子类可以使用addPreference方法添加参数项。

 

创建参数元素时参数的属性设置:

参数元素的属性设置方法可以参看代码,大部分均以“set”开头。xml文件中可以配置的属性,均可以使用代码来配置。

 

(3)、提交参数树

       创建好参数树后,调用PreferenceActivity.setPreferenceScreen(PreferenceScreen preferenceScreen)方法提交参数树,该参数树的内容就能够显示出来。

 

 

五、如何操作参数

       如何操作参数,即如何读取和修改参数。使用PreferenceActivity派生的子类,在如下几个函数中添加操作。

重载的方法

要做的事情

onCreate

加载参数树

onResume

初始化、更新参数页面中参数值

onPause

保存当前的参数值

onPreferenceChange

实现的Preference.OnPreferenceChangeListener接口,在此处理一些参数发生了变化的事情,不必在此保存参数值,处理后返回true

 

 

 

 

参数值的读取:

(1)、获取对应的SharedPreferences实例:

调用SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(Context context)获得。

(2)、使用pre读取参数值:

读取的方法,大多以“get”开头,可以传入默认值。如:

int mWriteColor = pre.getInt("WriteColor", 0xFFFF0000);

如果没有该参数,则返回默认值0xFFFF0000。

 

参数值的保存:

(1)、获取参数值访问接口:

Editor editor = mSharedPref.edit();

其中,mSharedPref为SharedPreferences实例,该实例可以通过PreferenceManager.getDefaultSharedPreferences(Context context)获得;

(2)、写参数值:

通过editor所提供的方法保存参数值,如

editor.putBoolean(KEY_NAME_KEY_SOUND, mKeySound);

是将参数值mKeySound以索引名KEY_NAME_KEY_SOUND保存到SharedPreferences实例所维护的一个数据文件中。

       更多接口方法参看代码。

(3)、提交:

只有在设置好了参数值后并调用如下的方法,最终的参数值才会被保存起来。

editor.commit();

 

六、参数文件

       preference这种参数访问机制,不允许跨进程使用,每个应用有自己独立的参数数据文件。

(1)、文件路径

系统运行时,应用的参数文件存在于如下路径:

data/data/packageName/shared_prefs

例如:

data/data/com.oppo.HanWangWriterIME/shared_prefs

导出以上的文件夹,在里面可以找到参数文件。该文件的命名规则为:

packageNam_preferences.xml

例如:com.oppo.HanWangWriterIME_preferences.xml

 

(2)、参数文件的组织形式

0 0