Android Preference經常使用在例如設置的功能,Android提供preference這個鍵值對的方式來處理這種情況,自動保存這些數據,並立時生效,這種就是使用android sharedpreferences方式進行保存的,不需要我們手動來寫,下面的圖片就是使用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()方法