Android Preference經常使用在例如設置的功能,Android提供preference這個鍵值對的方式來處理這種情況,自動保存這些數據,並立時生效,這種就是使用android sharedpreferences方式進行保存的,不需要我們手動來寫,下面的圖片就是使用Preference來進行保存的
添加一個簡單的Preference
添加一個Preference很簡單,首先看下圖片
我們在res目錄下添加一個xml目錄,里面添加一個itchq文件,這個文件相當於我們的Preference布局文件
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <CheckBoxPreference android:key="checkbox" android:title="CheckBoxPreference" android:summary="check it box" /> <RingtonePreference android:key="ring" android:title="ringtone" android:summary="check a ringtone" /> </PreferenceScreen>
這個就是itchq.xml里面的代碼,這里面的東西往下有介紹。我們再來看看那個Activity里面如何使用的
package com.itchq.itchqpreference; import com.itchq.itchqpreference.R; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.PreferenceActivity; import android.preference.RingtonePreference; public class ItChqActivity extends PreferenceActivity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.itchq); } }
上面的就是Activity的代碼,這個Activity不是繼承Activity這個類的而是PreferenceActivity,其實這個看字面的意思就是Activity的繼承子類,用法和Activity差不多相同的,在Activity中使用setContentView()方法來加載一個布局文件,在這里使用的是addPreferencesFromResource()方法來加載布局文件,既然是Activity就不要忘記在AndroidManifast.xml添加相應的配置,上面的運行結果如下圖
preference 通用的xml 布局屬性
在preference布局文件中,我們可以會經常用到下面的屬性,這些屬性都是preference控件相互通用的。
android:key 這個屬性相當於android:id的作用。用此key來唯一表示此Preference
android:title Preference的標題,
android:summary 表示Preference提示語,相對於android:title來說顯示要小點,而且顯示位置在android:title下面
android:defaultValue 這個表示的是默認值,比如CheclPreference這種preference就可以指定默認是"true"還是“false”
android:enabled 表示該Preference是否可用狀態
PreferenceScreen
preferenceScreen簡單的說就是所有Preference元素的根節點,我們可以看做是每一個PrederenceActivity布局的開始元素,當然這個PreferenceScreen也可以作為一個組件出現,里面可以嵌套其它組件,那么這個將會以另外的一屏顯示出來,就是當我們點擊后出現一個新的屏幕
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <CheckBoxPreference android:key="checkbox" android:title="CheckBoxPreference" android:summary="check it box" /> <RingtonePreference android:key="ring" android:title="ringtone" android:summary="check a ringtone" /> <PreferenceScreen android:key="screen" android:title="PreferenceScreen" android:summary="screen it" > <SwitchPreference android:key="switch" android:title="switchPreference" android:summary="switch it" /> <EditTextPreference android:key="edit" android:title="editPreference" android:summary="OK" /> </PreferenceScreen> </PreferenceScreen>
如上面的代碼里面有一個PreferenceScreen,這個PreferenceScreen里面嵌套了SwitchPreference和EditTextPreference,android:key相當android:id,我們到時候通過這個在Activity中找到對應的組件,android:title就是標題,android:summary就是這個一個提示語,這三個屬性都是最基本的信息,看下圖:
上面圖片中最后一項就是我們添加的,“PreferenceScreen”就是我們的android:title,“screen it”就是這個android:summary,那么當我們點擊這個選項時就會跳轉到一個新的頁面,頁面顯示如下圖:
這個就是上面的在PreferenceScreen中嵌套的兩個組件,SwitchPreference和EditTextPreference
PreferenceCategory
PreferenceCategory 這個控件類似於LinearLayou、RelativeLayout,用於組合一組Preference,使布局看起來具有層次關系,美觀
<PreferenceCategory android:key="category" android:title="PreferenceCategory" > <EditTextPreference android:key="edit" android:title="category" android:summary="OK" /> </PreferenceCategory>
如上圖中Category前面有一天很大的線,這個就是使用了PreferenceCategory效果。
Preference這個控件這里簡單介紹一下,這個就和我們的TextView是一樣的,就是顯示一個文本
ListPreference
ListPreference這個就是顯示一個相當的list,先看下面的代碼
<ListPreference android:key="list" android:title="Options" android:entries="@array/entry_list" android:entryValues="@array/values_list" android:dialogTitle="list dialogtitle" android:defaultValue="1" />
我們可以看到在這個代碼中android:entries屬性表示的就是這個listView對話框控件欲顯示的文本,android:entryValues與文本相對應的key-value鍵值對,value保存至sharedPreference文件,而我們的entries和entryValue屬性使用的數組定義在資源文件arrays.xml的數組名,我們來看看arrays.xml文件的定義
<resources> <string-array name="entry_list"> <item>total</item> <item>check</item> <item>airplace</item> </string-array> <string-array name="values_list"> <item>0</item> <item>1</item> <item>2</item> </string-array> </resources>
這個就是arrays.xml文件的定義,android:dialogTitle是指這個list彈出框的文本,android:defauleValues表示在缺省條件下顯示哪個值,這個值對應的是values_list的值,我們先來看看效果
如圖這個Options就是我們要ListPreference,當我們點擊這個之后顯示效果如下圖:
看到了把,我們的這個dialog形式來顯示listView的,默認android:defaultValues=“1”就是對應第二個"check",這個標題就是android:dialogTitle設置的
CheckBoxPreference
checkBoxPreference這個相當於checkBox,是一個多選,先看代碼
<CheckBoxPreference android:key="checkbox_one" android:title="checbox_one" android:summaryOn="On_check_one" android:summaryOff="offcheck_one" /> <CheckBoxPreference android:key="checkbox_two" android:summaryOff="offcheck_two" android:summaryOn="On_check_two" android:title="checbox_two" /> <CheckBoxPreference android:key="checkbox_three" android:summaryOff="offcheck_three" android:summaryOn="On_check_three" android:title="checbox_three" />
android:summaryOn和android:summaryOff表示在選擇和不選擇分別顯示的summary,運行效果圖如下:
當我們選擇checkbox_one是下面的offcheck_one提示就會修改為On_check_one
EditTextPreference
等同於EditText,相關的代碼顯示如下:
<EditTextPreference android:key="edit" android:title="Set Package Name" android:summary="Set the Package Name" android:dialogTitle="Package Name:" />
當我們點擊下面的“Set Package Name“的時候就會彈出這么一個文本對話框,”Package Name“就是這個android:dialogTitle的屬性
RingtonePreference
這個是一個鈴聲選項的功能,用得比較少不做介紹
MultiSelectListPreference
它的實現和ListPreference相似,不同的是還可以不選擇或者多個選擇,代碼是和ListPreference一樣的,運行效果如下圖:
從上面一些基本的Preference控件已經差不多介紹完了,下面再來介紹一個有關於點擊和存儲的功能使用:
首先來介紹一下如何在我們的PreferenceActivity中找到我們的控件,我們在Activity是通過findViewById()來找到我們指定的控件的,那么在PreferenceActivity中我們可以使用findPreference這個方法來找到指定的方法,用法如下:
mCheck=(CheckBoxPreference) findPreference("checkbox");
mRing=(RingtonePreference) findPreference("ring");
findPreference里面的參數就是我們使用android:key所定義的,這個應該容易理解。
在PreferenceActivity方法中,一個比較重要的監聽點擊事件方法為
@Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { // TODO Auto-generated method stub return true; }
參數 preference 表示的是點擊的對象,在我們繼承PreferenceActivity可以重寫該方法,來完成我們對Preference事件的捕捉,用法如下
@Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { // TODO Auto-generated method stub if(preference.getKey().equals("checkbox")){ Log.i("itchq", "checkbox"); } return true; }
除了上面這個監聽的方法之外,還有兩個重要的接口:
OnPreferenceChangeListener
當Preference的元素值發送改變時,觸發該事件,記住只有元素值改變才會觸發這個值,返回值為true 表示將新值寫入sharedPreference文件中
false 則不將新值寫入sharedPreference文件
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { // TODO Auto-generated method stub return false; }
OnPreferenceClickListener
當點擊控件時觸發發生,可以做相應操作
@Override public boolean onPreferenceClick(Preference preference) { // TODO Auto-generated method stub return false; }
那么這三個點擊事件在一起是什么用的呢?它的規則如下:
點擊某個Preference控件后,會先回調onPreferenceChange()方法,即是否保存值(這個下面會講解這個值是如何保存的),然后再回調onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我們得到的控件值就是最新的Preference控件值。然后onPreferenceClick會比onPreferenceTreeClick()方法先調用,如果onPreferenceClick方法返回true,那就不會再調用onPreferenceTreeClick()方法,如果onPreferenceClick()返回false就會繼續調用onPreferenceTreeClick()方法
數據的保存
前面我們說過,Android系統會將Preference元素的值存儲在sharedPreference文件中。該文件存放路徑位於 DDMS視圖下的data/data/[packgename]/shared_prefs/文件下,命名約定為:packagename_preferencse.xml 如下圖:
那么我們要如何去獲取這些已經保存的數據呢?首先我們要通過xml中的key獲取數值,就是Preference控件中android:key所對應的屬性(已一個鍵值對的形式保存,name為Preference的key值,value為Preference的value值),讀取方法如下:
SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ; Log.i("itchq", "checbox="+prefs.getBoolean("checkbox",false));
我們通過getDefaultSharedPreferences()方法來讀取的,”checkbox“就是我們CheckBoxPreference所定義的android:key屬性值,這樣是不是很方便,我們都不需要手動取保存這個對應的值,只要直接去取就可以了。preference的數值會被保留,而且可以在其他的 activity中讀取。如果需要清除數據,可以通過remove()清除某個名字的prefernece,clear()清除所有的 preferences。我們可以通過edit()獲取preferences的editor,進而進行編輯,修改后,通過commit()將修改值保存。