由于SharedPreferences可以很容易地保存key-value对,因此通常用SharedPreferences保存配置信息,不过Android SDK提供了更容易的方法来设计配置界面,并且可以透明地保存配置信息,这就是PreferenceActivity。
PreferenceActivity是Activity的子类,该类封装了SharedPreferences,因此PreferenceActivity的所以子类都拥有保存key-value的能力。
一个标准的xml文件(xml/preference_setting.xml)如下所示:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="我的位置源">
<CheckBoxPreference android:key="wireless_network"
android:title="使用无线网络" android:summary="使用无线网络查看应用程序(例如Google地图)中的位置" />
<CheckBoxPreference android:key="gps_satellite_setting"
android:title="启用GPS卫星设置" android:summary="定位时,精确到街道级别(取消选择可节约电量)" />
</PreferenceCategory>
<PreferenceCategory android:title="个人信息设置">
<CheckBoxPreference android:key="yesno_save_individual_info"
android:title="是否保存个人信息" />
<EditTextPreference android:key="individual_name"
android:title="姓名" android:summary="请输入真实姓名" />
<PreferenceScreen android:key="other_individual_msg"
android:title="其他个人信息" android:summary="是否工作、手机">
<CheckBoxPreference android:key="is_an_employee"
android:title="是否工作" />
<EditTextPreference android:key="mobile"
android:title="手机" android:summary="请输入真实的手机号" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
如果使用嵌套PreferenceScreen,则说明该设置页有一个子设置页,单击该设置页就会进入这个子设置页。
android:title和android:summary,分别表示设置项的标题和摘要,标题用大体字显示在摘要上方,摘要用小字显示。
onCreate方法并不需要设置布局文件,而只需要装载上面的xml文件即可。
addPreferencesfromResource(R.xml.preference_setting);
代码如下:
package net.blogjava.mobile;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceChangeListener;
public class Main extends PreferenceActivity implements
OnPreferenceChangeListener
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//getPreferenceManager().setSharedPreferencesName("setting");
addPreferencesFromResource(R.xml.preference_setting);
Preference individualNamePreference = findPreference("individual_name");
SharedPreferences sharedPreferences= individualNamePreference.getSharedPreferences();
individualNamePreference.setSummary(sharedPreferences.getString("individual_name", ""));
if (sharedPreferences.getBoolean("yesno_save_individual_info", false))
individualNamePreference.setEnabled(true);
else
individualNamePreference.setEnabled(false);
individualNamePreference.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue)
{
preference.setSummary(String.valueOf(newValue));
return true;
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference)
{
if ("yesno_save_individual_info".equals(preference.getKey()))
{
findPreference("individual_name").setEnabled(
!findPreference("individual_name").isEnabled());
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
}