当开发一个 Android 应用程序时,不可避免的需要进行选项设置,这些选项设置会以参数的形式保存,习惯上会用 Preferences 进行保存。用法参见 SharedPreferences:
//获取一个SharedPreferences对象
SharedPreferences sp = getSharedPreferences("dataInfo", 0);
//存储的上次输入的用户名到SharedPreferences中
sp.edit().putString("user",
((EditText)findViewById(R.id.edittext_account)).getText().toString())
.commit();
//获取登录界面中的用户名编辑框
final EditText account = (EditText) findViewById(R.id.edittext_account);
//获取一个SharedPreferences对象
SharedPreferences sp = getSharedPreferences("dataInfo", 0);
//获取SharedPreferences中存储的上次输入的用户名
String user = sp.getString("user", "");
account.setText(user);
如果 Android 应用程序中包含某个 Activity 专门用于设置选项参数,那么 Android 为这种 Activity 提供了便捷的基类:PreferenceActivity。
一旦 Activity 继承了 PreferenceActivity,那么该 Activity 完全不需要自己控制 Preferences 的读写,PreferenceActivity 会为我们处理一切。
PreferenceActivity 与普通的 Activity 不同,它不再使用普通的界面不觉文件,而是使用选项设置的布局文件。选项设置的布局文件以 PreferenceScreen 作为根元素——它表明定义一个参数设置的界面布局。
为了创建一个 PreferenceActivity,需要先创建一个对应的界面布局文件。从 Android 3.0开始,Android 不在推荐直接让 Preference 加载选项设置的布局文件,而是建议将PreferenceActivity 与 PreferenceFragment 结合使用,其中 PreferenceActivity 只负责加载选项设置列表的布局文件,PreferenceFragment 才负责加载选项设置的布局文件。
例1:PreferenceActivity 的使用
1. PreferenceActivity 的界面布局文件
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 指定启动指定PreferenceFragment的列表项 -->
<header android:fragment=
"org.crazyit.app.PreferenceActivityTest$Prefs1Fragment"
android:icon="@drawable/ic_settings_applications"
android:title="程序选项设置"
android:summary="设置应用的相关选项" />
<!-- 指定启动指定PreferenceFragment的列表项 -->
<header android:fragment=
"org.crazyit.app.PreferenceActivityTest$Prefs2Fragment"
android:icon="@drawable/ic_settings_display"
android:title="界面选项设置 "
android:summary="设置显示界面的相关选项">
<!-- 使用extra可向Activity传入额外的数据 -->
<extra android:name="website"
android:value="www.crazyit.org" />
</header>
<!-- 使用Intent启动指定Activity的列表项 -->
<header
android:icon="@drawable/ic_settings_display"
android:title="使用Intent"
android:summary="使用Intent启动某个Activity">
<intent android:action="android.intent.action.VIEW"
android:data="http://www.crazyit.org" />
</header>
</preference-headers>
上面的布局文件中定义了三个列表项,其中前两个列表项通过 android:fragment 选项指定启动相应的 PreferenceFragment,第三个列表项通过 intent 子元素启动指定的 Activity。
2.参数布局设置界面
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置系统铃声 -->
<RingtonePreference
android:ringtoneType="all"
android:title="设置铃声"
android:summary="选择铃声(测试RingtonePreference)"
android:showDefault="true"
android:key="ring_key"
android:showSilent="true">
</RingtonePreference>
<PreferenceCategory android:title="个人信息设置组">
<!-- 通过输入框填写用户名 -->
<EditTextPreference
android:key="name"
android:title="填写用户名"
android:summary="填写您的用户名(测试EditTextPreference)"
android:dialogTitle="您所使用的用户名为:" />
<!-- 通过列表框选择性别 -->
<ListPreference
android:key="gender"
android:title="性别"
android:summary="选择您的性别(测试ListPreference)"
android:dialogTitle="ListPreference"
android:entries="@array/gender_name_list"
android:entryValues="@array/gender_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="系统功能设置组 ">
<CheckBoxPreference
android:key="autoSave"
android:title="自动保存进度"
android:summaryOn="自动保存: 开启"
android:summaryOff="自动保存: 关闭"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
display_prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="背景灯光组">
<!-- 通过列表框选择灯光强度 -->
<ListPreference
android:key="light"
android:title="灯光强度"
android:summary="请选择灯光强度(测试ListPreference)"
android:dialogTitle="请选择灯光强度"
android:entries="@array/light_strength_list"
android:entryValues="@array/light_value_list" />
</PreferenceCategory>
<PreferenceCategory android:title="文字显示组 ">
<!-- 通过SwitchPreference设置是否自动滚屏 -->
<SwitchPreference
android:key="autoScroll"
android:title="自动滚屏"
android:summaryOn="自动滚屏: 开启"
android:summaryOff="自动滚屏: 关闭"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
4. PreferenceActivity 的代码
上面的布局文件中制动使用 Prefs1Fragment、Prefs2Fragment 两个内部类,为此我们将会在 PreferenceActivityTest 类中定义这两个内部类。如下所示:
PreferenceActivityTest.java
public class PreferenceActivityTest extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 该方法用于为该界面设置一个标题按钮
if (hasHeaders())
{
Button button = new Button(this);
button.setText("设置操作");
// 将该按钮添加到该界面上
setListFooter(button);
}
}
// 重写该该方法,负责加载页面布局文件
@Override
public void onBuildHeaders(List<Header> target)
{
// 加载选项设置列表的布局文件
loadHeadersFromResource(R.xml.preference_headers, target);
}
public static class Prefs1Fragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
public static class Prefs2Fragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.display_prefs);
// 获取传入该Fragment的参数
String website = getArguments().getString("website");
Toast.makeText(getActivity()
, "网站域名是:" + website , Toast.LENGTH_LONG).show();
}
}
}
上面的 Activity 重写了 PreferenceActivity 的 public void onBuildHeaders(List<Header> target) 方法,重写该方法指定加载前面 preferences.xml 定义的界面布局文件。
上面的 Activity 中定义了两个 PreferenceFragment,他们需要分别加载 preferences.xml、display_prefs 两个选项设置的布局文件。
后续链接: Activity 及其子类的使用四:配置 Activity