Preference直譯為偏好,博友建議翻譯為喜好設定。一些配置資料,一些我們上次點擊選擇的內容,我們希望在下次應用調起的時候依然有效,無須使用者再一次進行配置或選擇。Android提供preference這個索引值對的方式來處理這種情況,自動儲存這些資料,並立時生效,同時Android提供一種類似的layout的方式來進行Prefernce的布局。
一個簡單的Preferenece例子
步驟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介面
public class Chapter21Test1 extendsPreferenceActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.c21preference);
}
}
和用layout方式一樣,代碼很簡單。和以往介面最大的區別是,我們對checkbox進行選擇或者對ringtone進行選擇後,這個選擇結果是被保留的,當我們退出actitvity後再次進入,上次的選項依然保留,我們重新向模擬器load應用,發現之前的選項仍然存在。我們可以利用preference,而無須人工對資料進行儲存和讀取,很是方便。
步驟3:擷取preference的資料
處了在preference的介面中可以保留資料,我們也希望能夠讀出資料,以便這些資料可以用在其他的activity中。如果另一個activity和這些資料關聯,而且希望能夠即時進行同步,在onResume()中對preference保留的資料進行讀取,而後進行相關的更新。
首先要擷取preferences,然後通過索引值對的擷取方式根據key擷取數值,在xml中checkbox的key為“checkbox”,值的類型為布爾值,而rintong的值為String,例如:
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可以通過三種方式:
一、getPreferences():可以擷取同一activity中的preference;
二、getSharedPreferences():可以擷取映用層級的preferences(),在這個例子中由於我們封裝在同一app中,也可以使用SharePreferences prefs = getSharedPreferences( "com.wei.android.learning_preferences" ,0);其中第一個參數name的格式是<package_name>_preferences;
三、getDefaultSharedPreferences():就是我們例子的方式,通過Android的偏好管理器來擷取其所管理的preferences。
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是一一對應的。
相關連結:
我的Android開發相關文章