第九課: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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章