9.2.2 设置界面组件

在应用中,很多设置项的变更都需要用户参与,诸如让用户选择他喜欢的字体之类。为了帮助开发者构造出支持编辑浏览设置数据的界面,Android提供了一整套的界面框架支持。

在设置界面中,每个设置项都由一个android.preference.Preference对象来呈现,不同类型的设置项,需要使用不同的Preference子类进行表示。举个例子,类型是字符串的设置项,需要使用android.preference.EditTextPreference来展示和编辑;而类型是布尔值的设置项,则要用android.preference.CheckBoxPreference对象来呈现。开发者也可以通过派生Preference类,自定义设置项的呈现方式。

有一类特殊的Preference对象:android.preference.PreferenceGroup。顾名思义,PreferenceGroup是容器型的Preference对象,负责管理一组相关联的Preference对象。在实际开发中,常使用PreferenceGroup的子类android.preference.PreferenceCategory来划分设置项,每个PreferenceCategory都可以带有标题信息,并负责将一组逻辑上相关的Preference对象组织在一起;而另一个PreferenceGroup的子类android.preference.PreferenceScreen类,则会作为所有设置项的根节点存在,负责掌控设置界面中的所有设置项。

设置项编辑的界面组件,通常派生自android.preference.PreferenceActivity类。它可以将一个定制好的设置树转换成对应的控件呈现出来(如图9-2所示),一个示例如下:


public class PreferencesDemo extends PreferenceActivity{

@Override

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

this.addPreferencesFromResource(R.xml.preference);

}

}


其中,R.xml.preference表示描述设置信息的资源文件。大部分情况下,设置界面都可以通过资源文件进行描述,该资源文件需要放在XML资源目录中:


<?xml version="1.0"encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory android:title="设置项目录">

<EditTextPreference

android:title="可编辑项"

android:key="a_string"

android:summary="可以让用户填入一些内容">

</EditTextPreference>

<CheckBoxPreference

android:enabled="true"

android:key="a_bool"

android:title="可选项"

android:summary="可以设置是否勾选该设置项">

</CheckBoxPreference>

</PreferenceCategory>

</PreferenceScreen>


当然,如果界面中的很多设置项,都需要在运行时动态地进行变更,也可以使用代码直接构造和管理[1]

9.2.2 设置界面组件 - 图1

图 9-2 设置界面的构造和设置数据的存储

每个设置界面,都会与底层的设置存储密切关联。当用户对设置项进行编辑后,新的设置值会自动存储到设置文件中去。开发者可以添加事件监听对象,来掌控各类设置点击或变更事件。比如,如果期望在设置值发生变化后,调整设置项的提示文字,可以如下监听:


//构造监听对象

OnSharedPreferenceChangeListener changedListener=

new OnSharedPreferenceChangeListener(){

@Override

public void onSharedPreferenceChanged(

SharedPreferences sharedPreferences, String key){

if("a_bool".equals(key)){

//改变设置项的描述

}

};

//注册监听者,开始监听

@Override

protected void onResume(){

super.onResume();

SharedPreferences preferences=

getPreferenceScreen().getSharedPreferences();

preferences.registerOnSharedPreferenceChangeListener(

changedListener);

}

//注销监听者,停止监听

@Override

protected void onPause(){

super.onPause();

getPreferenceScreen().getSharedPreferences()

.unregisterOnSharedPreferenceChangeListener(

changedListener);

}


[1]在Android 3.0以上版本中,Android引入了新的android.preference.PreferenceFragment来取代PreferenceActivity的界面显示功能,使用PreferenceFragement可以更为灵活地构建兼容不同平板和手机的设置项交互界面,其使用方式与现有的PreferenceActivity类似,详情参见:http://developer.android.com/reference/android/preference/PreferenceFragment.html。