第九课:Activity 及其子类的使用三:PreferenceActivity

当开发一个 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>


3.选项设置布局文件

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


源代码下载



发布了34 篇原创文章 · 获赞 32 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章