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