當應用需要儲存使用者設定資訊的時候,我們可以使用前面所介紹的Activity+Preference完成,但要實作下圖所示的界面,這種方式就顯的有點麻煩,此時我們可以使用Android為我們提供的用于設定界面的元件,那就是PreferenceActivity。
PreferenceActivity的主要特點就是可以通過添加各種各樣的Preference UI控件,在使用者做完喜好設定過後,将這些Preference UI控件的狀态持久化儲存起來。其中,Android SDK提供了4種Preference UI的控件,分别是:
CheckBoxPreference控件:CheckBox選擇項,對應的值的ture或flase
EditTextPreference控件:輸入編輯框,值為String類型,會彈出對話框供輸入。
ListPreference控件: 清單選擇,彈出對話框供選擇。
RingtonePreference控件:系統玲聲選擇。
下面就上圖所示界面的實作進行說明
(1)建立工程PreferenceActivityDemo,在res目錄下面建立xml子目錄,右擊xml子目錄,選擇new|other|Android XML File指令,在彈出的對話框中的Resouce Type下拉清單中選擇Preference選項,在File輸入框中輸入preference_demo.xml,單擊Finish按鈕。
(2)編輯preference_demo.xml,源代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="賬号資訊" >
<EditTextPreference
android:defaultValue="請輸入昵稱"
android:dialogTitle="昵稱輸入"
android:key="nickname"
android:summary="使用者昵稱"
android:title="昵稱" />
<ListPreference
android:dialogTitle="性别"
android:key="sex"
android:title="性别" />
</PreferenceCategory>
<PreferenceCategory android:title="推送設定" >
<RingtonePreference
android:key="ring"
android:ringtoneType="all"
android:showSilent="true"
android:title="鈴聲設定" />
<CheckBoxPreference
android:defaultValue="true"
android:key="push"
android:summaryOff="不接受推送"
android:summaryOn="接受推送"
android:title="推送開關" />
</PreferenceCategory>
</PreferenceScreen>
(3)建立一個MainActivity繼承PreferenceActivity,代碼及說明如下:
package com.example.preferenceactivitydemo;
import android.content.SharedPreferences;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.widget.Toast;
import android.preference.PreferenceActivity;
import android.preference.RingtonePreference;
public class MainActivity extends PreferenceActivity {
String[] sex_rank_array = { "男", "女" };
String[] sex_rank_value_array = { "0", "1" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference_demo);// 加載Preference描述檔案
// CheckBoxPreference控件
CheckBoxPreference checkBoxPreference = (CheckBoxPreference) findPreference("push");// 根據key值找到控件
// 當Preference控件被點選時,觸發該方法。
checkBoxPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast.makeText(getApplicationContext(), "是否推送:" + newValue, Toast.LENGTH_LONG).show();
return true;// 傳回true時更新響應的存儲值
}
});
// RingtonePreference控件
final RingtonePreference ringtonePreference = (RingtonePreference) findPreference("ring");
final SharedPreferences sp = ringtonePreference.getPreferenceManager().getSharedPreferences();
ringtonePreference.setSummary(getRingtonName(sp.getString("ring1", "")));
ringtonePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
ringtonePreference.setSummary(getRingtonName(newValue.toString()));// newValue是一個uriString
sp.edit().putString("ring1", newValue.toString()).commit();// 擷取存儲的Uri值,儲存的檔案路徑在/data/data/[PackageName]/shared_prefs/[PackageName]_preferences.xml中
return true;
}
});
// ListPreference控件
final ListPreference listPreference = (ListPreference) findPreference("sex");
listPreference.setEntries(sex_rank_array);
listPreference.setEntryValues(sex_rank_value_array);
listPreference.setSummary(listPreference.getEntry());
listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast.makeText(getApplicationContext(), "性别:" + newValue, Toast.LENGTH_LONG).show();
listPreference.setSummary(sex_rank_array[Integer.parseInt(newValue + "")]);
return true;
}
});
// EditTextPreference控件
final EditTextPreference eitTextPreference = (EditTextPreference) findPreference("nickname");
eitTextPreference.setSummary(eitTextPreference.getText());// getText()傳回的是我們之前sharedPreferen檔案儲存的值
eitTextPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
eitTextPreference.setSummary(newValue.toString());
return true;
}
});
}
// 通過Uri查詢系統鈴聲的名稱
public String getRingtonName(String uriString) {
Uri uri = Uri.parse(uriString);
Ringtone r = RingtoneManager.getRingtone(this, uri);
return r.getTitle(this);
}
}