Preference直譯爲偏好,博友建議翻譯爲首選項。一些配置數據,一些咱們上次點擊選擇的內容,咱們但願在下次應用調起的時候依然有效,無須用戶再一次進行配置或選擇。Android提供preference這 個鍵值對的方式來處理這種狀況,自動保存這些數據,並立時生效,同時Android提供一種相似的layout的方式來進行Prefernce的佈局。java
一個簡單的Preferenece例子android
步驟1:編寫preference XML,在res/xml/下加入咱們的preference XML文件,例如名字叫c21preference.xml架構
<?xml version="1.0" encoding="utf-8"?> <!-- preference的組織方式有PreferenceScreen和PreferenceCategory,PreferenceCategory是帶 層次組織關係,在後面的例子體驗,而PreferenceScreen就是最平白和基礎的方式 --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 有四個基本組建,這個例子學習兩個。裏面的內容對照圖,很容易理解,RingtonePreference是選擇鈴音,這裏給出兩個選擇,系統默認的鈴音和無聲 --> <CheckBoxPreference android:key="checkbox" android:title="CheckBox Preference" android:summary="Check it on , check it off"/> <RingtonePreference android:key="ringtone" android:title="Ringtone Preference" android:showDefault="true" android:showSilent="true" android:summary="Pick a tone, any tone"/> </PreferenceScreen>
步驟2:在java源代碼中調用該xml,生成相應的preference界面app
public class Chapter21Test1 extendsPreferenceActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.c21preference); } }
和用layout方式同樣,代碼很簡單。和以往界面最大的區別 是,咱們對checkbox進行選擇或者對ringtone進行選擇後,這個選擇結果是被保留的,當咱們退出actitvity後再次進入,上次的選項依 然保留,咱們從新向模擬器load應用,發現以前的選項仍然存在。咱們能夠利用preference,而無須人工對數據進行保存和讀取,非常方便。ide
步驟3:獲取preference的數據佈局
處了在preference的界面中能夠保留數據,咱們也但願能 夠讀出數據,以便這些數據能夠用在其餘的activity中。若是另外一個activity和這些數據關聯,並且但願可以實時進行同步,在 onResume()中對preference保留的數據進行讀取,然後進行相關的更新。學習
首先要獲取preferences,而後經過鍵值對的獲取方式根據key獲取數值,在xml中checkbox的key爲「checkbox」,值的類型爲布爾值,而rintong的值爲String,例如:this
protected void onResume() { //在另外一個Activity中 super.onResume(); SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ; System.out.println(new Boolean(prefs.getBoolean("checkbox",false)).toString()); //false表示沒有查到checkbox這個key的返回值 System.out.println(prefs.getString("ringtone","<unset>")); //<unset>表示沒有查到ringtong這個key的返回值 }
獲取preferences能夠經過三種方式:
1、getPreferences():能夠獲取同一activity中的preference;
2、getSharedPreferences():能夠獲取映用級別的preferences(),在這個例子中因爲咱們封裝在同一app中,也可使 用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);其中第一個參數name的格式是<package_name>_preferences;
3、getDefaultSharedPreferences():就是咱們例子的方式,經過Android的偏好管理器來獲取其所管理的preferences。spa
Preferenece數據的操做翻譯
在上面的例子中,preference的數值會被保留,並且能夠 在其餘的activity中讀取。若是須要清除數據,能夠經過remove()清除某個名字的prefernece,clear()清除全部的 preferences。咱們能夠經過edit()獲取preferences的editor,進而進行編輯,修改後,經過commit()將修改值保 存。
Preferenece XML
Preference的XML能夠經過 PreferenceCategory來進行組織。PreferenceCategory能夠將幾個組建組合在一塊兒,並加上標題。咱們依然用前面的xml 例子,經過PreferenceCategory來進行組織,以下:和以前的例子比較,將chekcbox和rintong組織成爲一個 category,並加上了"simple Preferences"的標題。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Simple Preferences"> <CheckBoxPreference android:key="checkbox" ..../> <RingtonePreference android:key="ringtone" ... /> </PreferenceCategory> </PreferenceScreen>
PreferenceCategory也能夠嵌套 PreferenceScreen,PreferenceScreen中的內容,將經過另外一屏來顯示,咱們在上面例子後面添加一個嵌套了 PreferenceScreen的PreferenceCategory。整個PreferenceScreen做爲一個組件出現,點擊後新的一屏,由 入PreferenceScreen定義。經過這個關係,咱們能夠組織本身的preference架構。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Simple Preferences"> <CheckBoxPreference android:key="checkbox" ..../> <RingtonePreference android:key="ringtone" ... /> </PreferenceCategory> <PreferenceCategory android:title="Detail Screens"> <PreferenceScreen android:title="Detail" android:summary="Addtional preference help in another page"> <CheckBoxPreference android:key="checkbox2" android:title="Another Checkbox" android:summary="On or Off, It's a problem...."/> </PreferenceScreen> </PreferenceCategory> </PreferenceScreen>
![]() ![]() |
在前面的例子中咱們使用了CheckBox和Ringtong,在下面的例子,咱們實驗另外的兩個組建EditText和List,這兩種都是已彈框的方式。在上面的例子咱們繼續增長內容
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen ...> ...... <PreferenceCategory android:title="Other Preferences"> <EditTextPreference android:key="text" android:title="Text Entry Dialog" android:summary="Click to pop up a field for entry" android:dialogTitle="Enter something useful"/> <ListPreference android:key="list" android:title="Selection Dialog" android:summary="Click to pop yo a list for select" android:entries="@array/cities" android:entryValues="@array/airport_codes" android:dialogTitle="Choose a City"/> </PreferenceCategory> </PreferenceScreen>
在list中由兩個引用@array/cities和@array/airport_codes,咱們在資源文件中定義此兩array。內容以下: <resource> <string-array> <item>Pittsburgh</item> <item>Allentown/Bethlehem</item> <item>Erie</item> ... ... </string-array> <string-array name="airport_codes"> <item>PHL</item> <item>PIT</item> <item>ABE</item> ... ... </string-array> </resources>
運行結果以下圖所示。對於EditText,鍵值對保存的值是 String,即用戶在輸入框中輸入的內容。List的狀況稍微複雜一些,在設置ListPreference的屬性有一個entires,這是在 List顯示給用戶看的內容,若是咱們去獲取preference的值,在這個例子爲prefs.getString("list", "<unset>");,則返回在entryValues對應的數值,例如咱們選擇了第一個item:Pittsburgh,則獲取的值爲 PHL。entries和entryValues是一一對應的。