當開發一個 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