1.PreferenceActivity 介紹
PreferenceActivity 繼承ListActivity 它是以一個列表的形式在展現內容,它最主要的特點是添加Preference可以讓控件的狀態持久化儲存,舉個例子 比如用戶選中checkbox後 退出應用然後在進入應用,這時用戶希望看到的是checkbox被選中,所以軟件須要記錄用戶每次操作的過程並且持久儲存,在進入應用的時候須要判斷這些久儲存的數據然後將系統控件的狀態呈現在UI中。
尤其是軟件開發肯定會有一堆設置選項選項,每次進入Activity都去手動的去取儲存的數據,這樣代碼會變得很復雜很麻煩。 這個時候Preference就出來了,它就是專門解決這些特殊的選項保存與讀取的顯示。用戶每次操作事件它會及時的以鍵值對的形式記錄在SharedPreferences中,Activity每次啟動它會自動幫我們完成數據的讀取以及UI的顯示。
android開發中一共為我們提供了4個組件,分別是CheckBoxPreference組件、EditTextPreference組件、ListPreference組件、RingtonePreference組件,下面我用一個例子一一向同學們介紹一下。
2.CheckBoxPreference組件
CheckBoxPreference 選中為true 取消選中為false 它的值會以boolean的形式儲存在SharedPreferences中。
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory android:title="CheckBoxPreference">
- <CheckBoxPreference android:key="checkbox_0"
- android:title="CheckBox_A"
- android:summary="這是一個勾選框A" >
- </CheckBoxPreference>
-
- <CheckBoxPreference android:key="checkbox_1"
- android:title="CheckBox_B"
- android:summary="這是一個勾選框B" >
- </CheckBoxPreference>
- </PreferenceCategory>
- </PreferenceScreen>
Java代碼
- import android.content.Context;
- import android.os.Bundle;
- import android.preference.CheckBoxPreference;
- import android.preference.Preference;
- import android.preference.PreferenceActivity;
- import android.preference.Preference.OnPreferenceChangeListener;
- import android.preference.Preference.OnPreferenceClickListener;
- import android.widget.Toast;
-
- public class CheckBoxActivity extends PreferenceActivity {
-
- Context mContext = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences
- addPreferencesFromResource(R.xml.checkbox);
-
- mContext = this;
-
- //CheckBoxPreference組件
- CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference("checkbox_0");
- mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-
- @Override
- public boolean onPreferenceClick(Preference preference) {
- //這裡可以監聽到這個CheckBox 的點擊事件
- return true;
- }
- });
-
- mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-
- @Override
- public boolean onPreferenceChange(Preference arg0, Object newValue) {
- //這裡可以監聽到checkBox中值是否改變了
- //並且可以拿到新改變的值
- Toast.makeText(mContext, "checkBox_0改變的值為" + (Boolean)newValue, Toast.LENGTH_LONG).show();
- return true;
- }
- });
-
- CheckBoxPreference mCheckbox1 = (CheckBoxPreference) findPreference("checkbox_1");
- mCheckbox1.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-
- @Override
- public boolean onPreferenceClick(Preference preference) {
- //這裡可以監聽到這個CheckBox 的點擊事件
- return true;
- }
- });
-
- mCheckbox1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-
- @Override
- public boolean onPreferenceChange(Preference arg0, Object newValue) {
- //這裡可以監聽到checkBox中值是否改變了
- //並且可以拿到新改變的值
- Toast.makeText(mContext, "checkBox_1改變的值為" + (Boolean)newValue, Toast.LENGTH_LONG).show();
- return true;
- }
- });
- }
- }
3.EditTextPreference組件
EditTextPreference 點擊後會彈出一個輸入框,輸入的內容會以字符串的的形式儲存在SharedPreferences中。
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory android:title="EditTextPreference">
- <EditTextPreference android:key="edit_0"
- android:title="輸入信息_A"
- android:summary="請輸入您的信息"
- android:defaultValue="請輸入信息"
- android:dialogTitle="輸入框">
- </EditTextPreference>
-
- <EditTextPreference android:key="edit_1"
- android:title="輸入信息_B"
- android:summary="請輸入您的信息"
- android:defaultValue="請輸入信息"
- android:dialogTitle="輸入框">
- </EditTextPreference>
- </PreferenceCategory>
- </PreferenceScreen>
Java代碼
- import android.content.Context;
- import android.os.Bundle;
- import android.preference.EditTextPreference;
- import android.preference.PreferenceActivity;
-
- public class EditTextActivity extends PreferenceActivity {
-
- Context mContext = null;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences
- addPreferencesFromResource(R.xml.edittext);
-
- mContext = this;
-
- // EditTextPreference組件
- EditTextPreference mEditText = (EditTextPreference) findPreference("edit_0");
-
- //設置dialog按鈕信息
- mEditText.setPositiveButtonText("確定");
- mEditText.setNegativeButtonText("取消");
-
- //設置按鈕圖標
- mEditText.setDialogIcon(R.drawable.jay);
- }
-
- }
4.ListPreference組件
在res/array中先寫兩個數組,一個用與list的顯示內容,一個用戶list的選中數值。
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
-
- <string-array name="auto_logout_time_key">
- <item>10 mins.</item>
- <item>20 mins.</item>
- <item>30 mins.</item>
- <item>60 mins.</item>
- </string-array>
-
- <string-array name="auto_logout_time_value">
- <item>600000</item>
- <item>1200000</item>
- <item>1800000</item>
- <item>3600000</item>
- </string-array>
- </resources>
ListPreference點擊後會彈出一個列表框,選中後會將選中的內容(上面數組中的值)會以字符串的的形式儲存在SharedPreferences中。
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory android:title="ListPreference">
- <ListPreference
- android:key="list_0"
- android:title="登錄設置A"
- android:dialogTitle="選擇在線時間"
- android:entries="@array/auto_logout_time_key"
- android:entryValues="@array/auto_logout_time_value" >
- </ListPreference>
-
- <ListPreference
- android:key="list_0"
- android:title="登錄設置A"
- android:dialogTitle="選擇在線時間"
- android:entries="@array/auto_logout_time_key"
- android:entryValues="@array/auto_logout_time_value" >
- </ListPreference>
- </PreferenceCategory>
- </PreferenceScreen>
Java代碼
- import android.os.Bundle;
- import android.preference.PreferenceActivity;
-
- public class ListActivity extends PreferenceActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences
- addPreferencesFromResource(R.xml.list);
- }
- }
5.RingtonePreference組件
RingtonePreference點擊後會彈出一個系統鈴聲的列表框,選中後會將選中的內容(uri字符集)會以字符串的的形式儲存在SharedPreferences中。
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory android:title="RingtonePreference">
- <RingtonePreference
- android:key="ringtone_0"
- android:summary="選擇系統鈴聲A"
- android:title="鈴聲設置"
- android:ringtoneType="all"
- android:showSilent="true" ></RingtonePreference>
-
- <RingtonePreference
- android:key="ringtone_!"
- android:summary="選擇系統鈴聲B"
- android:title="鈴聲設置"
- android:ringtoneType="all"
- android:showSilent="true" ></RingtonePreference>
-
- </PreferenceCategory>
- </PreferenceScreen>
android:ringtoneType 系統一共提供了4中響鈴模式的類型分別為 鈴聲(ringtone) 通知( notification) 警告(alarm) 全部(all)
模擬器默認是沒有鈴聲的,下圖中的鈴聲我是將歌曲文件拷貝到SD卡中,設置鈴聲後才會出現的。如果覺得拷貝麻煩可以使用豌豆莢或者91助手將歌曲文件放入手機SD卡中,在鈴聲設置那裡設置一下在這裡就會出現。
Java代碼
- import android.os.Bundle;
- import android.preference.PreferenceActivity;
-
- public class RingtoneActivity extends PreferenceActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences
- addPreferencesFromResource(R.xml.ringtone);
- }
- }
5.自定義控件
使用系統的控件在顯示方面難免會有些單一,如果想做一個好看的界面就需要使用自定義Preference。下面我簡單說明一下如何編寫自定義Preference。首先在res/layout中添加preferences文件
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#00000000">
- <LinearLayout
- android:gravity="center_vertical"
- android:background="@drawable/preference_mid_background"
-
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- <ImageView
- android:focusable="false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:src="@drawable/setting_about_us">
- </ImageView>
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="15dip"
- android:layout_marginTop="6dip"
- android:layout_marginRight="6dip"
- android:layout_marginBottom="6dip"
- android:layout_weight="1"
- >
- <TextView
- android:textSize="15dip"
- android:textColor="#000000"
- android:ellipsize="marquee"
- android:id="@+android:id/title"
- android:fadingEdge="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- >
- </TextView>
- <TextView
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="#565656"
- android:id="@+android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxLines="4"
- android:layout_below="@+android:id/title"
- android:layout_alignLeft="@+android:id/title"
- >
- </TextView>
- </RelativeLayout>
- <ImageView
- android:focusable="false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/preference_arrows"/>
- </LinearLayout>
- </LinearLayout>
android:background=”@drawable/preference_mid_background”
通過這一行可以設置這個按鈕的點擊、選中默認的顯示狀態,這樣可以讓你的按鈕更加好看。須要在res/drawable中添加xml文件
android:state_facused :為控件選中顯示
android:state_pressed:為控件按下顯示
最後一個為默認顯示
XML/HTML代碼
- <?xml version="1.0" encoding="utf-8"?>
- <selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:state_focused="true"
- android:drawable="@drawable/preference_mid_pressed"
- >
- </item>
- <item
- android:state_pressed="true"
- android:drawable="@drawable/preference_mid_pressed"
- >
- </item>
- <item
-
- android:drawable="@drawable/preference_mid"
- >
- </item>
-
- </selector>
Java代碼
- import android.content.Context;
- import android.os.Bundle;
- import android.preference.Preference;
- import android.preference.PreferenceActivity;
- import android.preference.Preference.OnPreferenceClickListener;
- import android.widget.Toast;
-
- public class AllActivity extends PreferenceActivity {
-
- /**自定義布局A**/
- Preference preference0 = null;
-
- /**自定義布局B**/
- Preference preference1 = null;
-
- Context mContext = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 從資源文件中添Preferences ,選擇的值將會自動保存到SharePreferences
- addPreferencesFromResource(R.xml.all);
- mContext = this;
-
- preference0 = findPreference("pref_key_0");
-
- preference0.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Toast.makeText(mContext, "自定義布局A被按下", Toast.LENGTH_LONG).show();
- return false;
- }
- });
- preference1 = findPreference("pref_key_1");
-
- preference1.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Toast.makeText(mContext, "自定義布局B被按下", Toast.LENGTH_LONG).show();
- return false;
- }
- });
- }
- }
讀取數據
在PreferenceActivity中可以用下面這種方式拿到SharedPreferences中儲存的數值,通過PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默認儲存的sharedPreferences對象。
Java代碼
- SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
- boolean something = prefs.getBoolean("something",false);
在模擬起中將SharedPreferences儲存內容拷貝出來後,可以清楚的看到通過點擊系統控件儲存的數值。這裡我說一下鈴聲的儲存,它是以一個字符串形式的uri字符集,它所指向的是系統鈴聲儲存的路徑。所以根據這個字符集就可以找到這個鈴聲。
XML/HTML代碼
- <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
- <map>
- <string name="ringtone_!">content://media/external/audio/media/1</string>
- <string name="ringtone_0">content://media/external/audio/media/1</string>
- <string name="list_0">1800000</string>
- <string name="edit_1">請輸入信息1212</string>
- <string name="list">1200000</string>
- <string name="ringtone">content://settings/system/ringtone</string>
- <boolean name="checkbox_0" value="true" />
- <boolean name="checkbox_1" value="true" />
- <string name="edit_0">請輸入信息</string>
- </map>
源碼下載地址:http://vdisk.weibo.com/s/aa3UT