android基础--PreferenceActivity
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中。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?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> |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 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中。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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> |
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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的選中數值。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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> |
?
ListPreference點擊后會彈出一個列表框,選中后會將選中的內容(上面數組中的值)會以字符串的的形式儲存在SharedPreferences中。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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> |
| 1 2 3 4 5 6 7 8 9 10 11 | 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中。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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卡中,在鈴聲設置那里設置一下在這里就會出現。
| 1 2 3 4 5 6 7 8 9 10 11 | 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文件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? android:background="#00000000"> ? ? <LinearLayout ? ? ? ? android:gravity="center_vertical" ? ? ? ? android:background="@drawable/preference_mid_background" ? ? ? ? android:layout_width="match_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:為控件按下顯示
最后一個為默認顯示
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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對象。
| 1 2 | SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ; boolean something = prefs.getBoolean("something",false); |
?
在模擬起中將SharedPreferences儲存內容拷貝出來后,可以清楚的看到通過點擊系統控件儲存的數值。這里我說一下鈴聲的儲存,它是以一個字符串形式的uri字符集,它所指向的是系統鈴聲儲存的路徑。所以根據這個字符集就可以找到這個鈴聲。
| 1 2 3 4 5 6 7 8 9 10 11 12 | <?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
?
- 本文固定鏈接:?https://www.xuanyusong.com/archives/155
- 轉載請注明:?雨松MOMO?2012年04月27日?于?雨松MOMO程序研究院?發表
?
?
總結
以上是生活随笔為你收集整理的android基础--PreferenceActivity的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win桌面显示html,win10怎么把
- 下一篇: [css] 请写出:link、:vis