Android Prefence 总结
PreferenceActivity通常用在設(shè)置界面,用于保存設(shè)置的狀態(tài)數(shù)據(jù)。在Android系統(tǒng)源碼中,絕大多數(shù)應(yīng)用程序的UI布局采用了Preference的布局結(jié)構(gòu),而不是我們平時(shí)在模擬器中構(gòu)建應(yīng)用程序時(shí)使用的View布局結(jié)構(gòu),例如,Setting模塊中布局。Preference布局結(jié)構(gòu)和View的布局結(jié)構(gòu)本質(zhì)上還是大同小異,Preference的優(yōu)點(diǎn)在于布局界面的可控性和高效率以及可存儲(chǔ)值的簡(jiǎn)潔性(每個(gè)PreferenPreferencece存儲(chǔ)在相對(duì)應(yīng)下的SharedPreference文件夾下)。?下面,我們對(duì)比Preference和View下得各個(gè)子控件,對(duì)他們的家庭元素在宏觀上有個(gè)更好的把握性。
?
? 在應(yīng)用程序中,我們可以通過(guò)代碼的方式來(lái)訪問(wèn)該sharedPreference文件,繼而可以對(duì)其進(jìn)行讀取甚至任何操作。代碼如下:?
//?得到我們的存儲(chǔ)Preferences值的對(duì)象,然后對(duì)其進(jìn)行相應(yīng)操作??
SharedPreferences?shp?=?PreferenceManager.getDefaultSharedPreferences(this);??
boolean?apply_wifiChecked?=?shp.getBoolean("apply_wifi",?false);
?
文件保存路徑:Android系統(tǒng)會(huì)將Preference元素的值存儲(chǔ)在sharedPreference文件中。該文件位于data/data/[packgename]/shared_prefs/文件下,命名約定為:packagename_preferencse.xml。
?
控件含義???????? Preference?控件家庭?????????View控件家庭???????
文本框????????????? Preference??????????????????TextView???????????
單選框?????????? CheckPreference?????????????CheckBox???????????
輸入文本框?????????? EditTextPreference??????????EditText???????????
列表框???????????? ListPreference??????????????ListView??????????
鈴聲??????????? RingtonePreference??????????——???????????????
??? 其實(shí)在Android源碼系統(tǒng)中還有很多的”未完工”的Preference,?沒(méi)有為它們提供PI接口,例如SeekBarPreference。有興趣的同學(xué)可以參考源碼,具體路徑為:frameworks/base/core/java/preference。
?
組合控件:
PreferenceCategory?:類似于LinearLayou、RelativeLayout,用于組合一組Preference,使布局更具備層次感?。
PreferenceScreen??:?所有Preference元素的根節(jié)點(diǎn)。
顯示Preference布局結(jié)構(gòu)的方法為:新建Activity繼承PreferenceActivity,然后在onCreate()方法中通過(guò)addPreferencesFromResource(R.xml.custom_preference)?(我們自定義的Preference?布局)。
?
Preference元素的通用XML?Attributes說(shuō)明:
android:key?:??????????每個(gè)Preference控件獨(dú)一無(wú)二的”ID”,唯一表示此Preference。??????????
android:defaultValue?:?默認(rèn)值。?例如,CheckPreference的默認(rèn)值可為”true”,默認(rèn)為選中狀態(tài);EditTextPreference的默認(rèn)值可為”110”?。
android:enabled?:??????表示該P(yáng)reference是否可用狀態(tài)。?????
? android:title?:????????每個(gè)Preference在PreferenceScreen布局上顯示的標(biāo)題——大標(biāo)題
??? android:summary?:??????每個(gè)Preference在PreferenceScreen布局上顯示的標(biāo)題——小標(biāo)題(可以沒(méi)有)
??? android:persistent:????表示Preference元素所對(duì)應(yīng)的值是否寫(xiě)入sharedPreferen文件中,如果是true,則表示寫(xiě)入;否則,則表示不寫(xiě)入該P(yáng)reference元素的值。
??? android:dependency:????表示一個(gè)Preference(用A表示)的可用狀態(tài)依賴另外一個(gè)Preference(用B表示)。B可用,則A可用;B不可用,則A不可用。
? android:disableDependentsState:??與android:dependency相反。B可用,則A不可用;B不可用,則A可用。
?
常用的方法則包括:
???? getKey()??????? setKey()
getSummary()??? setSummary()
? getText()?????? setText() //getXXX()代表取得xxx屬性的值。
?
一個(gè)簡(jiǎn)易的效果圖如下:
?
Preference的跳轉(zhuǎn):
方法一:在配置每個(gè)Preference元素節(jié)點(diǎn)時(shí),我們可以顯示為點(diǎn)擊它時(shí)所跳轉(zhuǎn)的Intent。點(diǎn)擊該P(yáng)reference,跳轉(zhuǎn)至目標(biāo)Intent。除非在onPreferenceTreeClick()方法中進(jìn)行抉擇。在xml中配置如下:
<Preference?android:key="wifi_setting"?android:title="Wi-Fi設(shè)置"??
????android:summary="設(shè)置和管理無(wú)線接入點(diǎn)"?android:dependency="apply_wifi">??
????<!--?點(diǎn)擊時(shí)?自定義一個(gè)默認(rèn)跳轉(zhuǎn)Intent??action指定隱式Intent?-->??
????<!--?action指定隱式Intent?;?targetPackage和targetClass指定顯示Intent-->??
????<intent?android:action="com.xsl.seemAction"?android:targetPackage="com.xsl.qin"?android:targetClass="com.xsl.qin.MainActivity"?/>??
</Preference>
方法二:可以實(shí)現(xiàn)onPreferenceTreeClick()創(chuàng)建新的intent顯示的進(jìn)行跳轉(zhuǎn)。
?
??接下來(lái),對(duì)每個(gè)Preference的的獨(dú)有XML?Attributes和方法進(jìn)行一下總結(jié),使大家有更好的深入理解。
1、EditPreference?
方法:
getEditText()??返回的是我們?cè)谠摽丶休斎氲奈谋究蛑?/p>
? getText()?????返回的是我們之前sharedPreferen文件保存的值
2、ListPreference
XML?Attributes:
? android:dialogTitle:彈出控件對(duì)話框時(shí)顯示的標(biāo)題
??? android:entries:類型為array,控件欲顯示的文本
android:entryValues:類型為array,與文本相對(duì)應(yīng)的key-value鍵值對(duì),value保存至sharedPreference文件
??? 說(shuō)明:entries和entryValue屬性使用的數(shù)組為定義在資源文件arrays.xml的數(shù)組名:
方法:
??? CharSequence[]????getEntries():?返回的是控件顯示文本的一個(gè)”key”數(shù)組,對(duì)應(yīng)于屬性android:entries
?? CharSequence[]????getEntryValues():返回的一個(gè)”value”數(shù)組,對(duì)應(yīng)于屬性android:?entryValues
CharSequence? getEntry():?返回當(dāng)前選擇文本
??? String?????????? getValue()?:返回當(dāng)前選中文本選中的value?。
與之對(duì)應(yīng)的還有它們所對(duì)應(yīng)的setXXX()方法,可以參考SDK進(jìn)行分析。
3、RingtonePreference
XML?Attributes:
android:ringtoneType:響鈴的鈴聲類型,主要有:ringtone(音樂(lè))、notification(通知)、alarm(鬧鈴)、all(所有可用聲?音類型)。
?? android:showDefault?:默認(rèn)鈴聲,可以使用系統(tǒng)(布爾值---true,false)的或者自定義的鈴聲
?? android:showSilent??:指定鈴聲是否為靜音。指定鈴聲包括系統(tǒng)默認(rèn)鈴聲或者自定義的鈴聲
?
分析Preference事件
? 在PreferenceActivity方法中,一個(gè)比較重要的監(jiān)聽(tīng)點(diǎn)擊事件方法為:
/*?說(shuō)?明?:?當(dāng)Preference控件被點(diǎn)擊時(shí),觸發(fā)該方法。
?????*?參數(shù)說(shuō)明:?preference???點(diǎn)擊的對(duì)象。
?????*?返回值:???true??代表點(diǎn)擊事件已成功捕捉,無(wú)須執(zhí)行默認(rèn)動(dòng)作或者返回上層調(diào)用鏈。例如,不跳轉(zhuǎn)至默認(rèn)Intent。?false?代表執(zhí)行默認(rèn)動(dòng)作并且返回上層調(diào)用鏈。例如,跳轉(zhuǎn)至默認(rèn)Intent。
?????*/
public?boolean?onPreferenceTreeClick(PreferenceScreen?preferenceScreen,?Preference?preference)
?
Preference相關(guān)的兩個(gè)重要監(jiān)聽(tīng)接口。
??? Preference.OnPreferenceChangeListener? 該監(jiān)聽(tīng)器的一個(gè)重要方法如下:
???/*
?*?說(shuō)明:??當(dāng)Preference的元素值發(fā)送改變時(shí),觸發(fā)該事件。
?*?返回值:true??代表將新值寫(xiě)入sharedPreference文件中。?false?則不將新值寫(xiě)入sharedPreference文件
?*/
boolean?onPreferenceChange(Preference?preference,Object?objValue)
?
?? Preference.OnPreferenceClickListener??????該監(jiān)聽(tīng)器的一個(gè)重要方法如下:
????/*
?*?說(shuō)明:當(dāng)點(diǎn)擊控件時(shí)觸發(fā)發(fā)生,可以做相應(yīng)操作。
?*/
public?boolean?onPreferenceClick(Preference?preference)??????????????????
????那么當(dāng)一個(gè)Preference控件實(shí)現(xiàn)這兩個(gè)接口時(shí),當(dāng)被點(diǎn)擊或者值發(fā)生改變時(shí),觸發(fā)方法是如何執(zhí)行的呢?事實(shí)上,
觸發(fā)規(guī)則如下:
??????1.先調(diào)用onPreferenceClick()方法,如果該方法返回true,則不再調(diào)用onPreferenceTreeClick方法;
???????如果onPreferenceClick方法返回false,則繼續(xù)調(diào)用onPreferenceTreeClick方法。
??????2.onPreferenceChange的方法獨(dú)立與其他兩種方法的運(yùn)行。也就是說(shuō),它總是會(huì)運(yùn)行。
?
??????補(bǔ)充:點(diǎn)擊某個(gè)Preference控件后,會(huì)先回調(diào)onPreferenceChange()方法,即是否保存值,然后再回調(diào)onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/??onPreferenceTreeClick方法中我們得到的控件值就是最新的Preference控件值。
public class HelloPreference extends PreferenceActivity implementsPreference.OnPreferenceClickListener,Preference.OnPreferenceChangeListener {private static String TAG = "HelloPreference";private CheckBoxPreference mapply_wifiPreference; //打開(kāi)wifiprivate CheckBoxPreference mapply_internetPreference; //Internet共享private ListPreference depart_valuePreference; //部門設(shè)置private EditTextPreference number_editPreference; //輸入電話號(hào)碼private Preference mwifi_settingPreference; //wifi設(shè)置private String oldDeptId; // 舊部門的名稱public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.mypreference);//根據(jù)key值找到控件mapply_wifiPreference = (CheckBoxPreference) findPreference("apply_wifi");mapply_internetPreference = (CheckBoxPreference) findPreference("apply_internet");depart_valuePreference = (ListPreference) findPreference("depart_value");number_editPreference = (EditTextPreference) findPreference("number_edit");mwifi_settingPreference = (Preference) findPreference("wifi_setting");// 設(shè)置監(jiān)聽(tīng)器mapply_internetPreference.setOnPreferenceClickListener(this);mapply_internetPreference.setOnPreferenceChangeListener(this);depart_valuePreference.setOnPreferenceClickListener(this);depart_valuePreference.setOnPreferenceChangeListener(this);number_editPreference.setOnPreferenceClickListener(this);number_editPreference.setOnPreferenceChangeListener(this);mwifi_settingPreference.setOnPreferenceClickListener(this);// 得到我們的存儲(chǔ)Preferences值的對(duì)象,然后對(duì)其進(jìn)行相應(yīng)操作SharedPreferences shp = PreferenceManager.getDefaultSharedPreferences(this);boolean apply_wifiChecked = shp.getBoolean("apply_wifi", false);}// 對(duì)控件進(jìn)行的一些操作private void operatePreference(Preference preference) {if (preference == mapply_wifiPreference){ //點(diǎn)擊了 "打開(kāi)wifi"Log.i(TAG, " Wifi CB, and isCheckd ="+ mapply_wifiPreference.isChecked());}else if (preference.getKey().equals("apply_internet")){ //點(diǎn)擊了"Internet共享"Log.i(TAG, " internet CB, and isCheckd = "+mapply_internetPreference.isChecked());}else if (preference == depart_valuePreference){ //點(diǎn)擊了 "部門設(shè)置"Log.i(TAG, " department CB,and selectValue = "+ depart_valuePreference.getValue() + ", Text="+ depart_valuePreference.getEntry());}else if (preference.getKey().equals("wifi_setting")) { //點(diǎn)擊了"wifi設(shè)置"mwifi_settingPreference.setTitle("its turn me.");}else if (preference == number_editPreference) //點(diǎn)擊了"輸入電話號(hào)碼"Log.i(TAG, "Old Value="+ number_editPreference.getText() + ", New Value="+ number_editPreference.getEditText().toString());}// 點(diǎn)擊事件觸發(fā)@Overridepublic boolean onPreferenceClick(Preference preference) {// TODO Auto-generated method stubLog.i(TAG, "onPreferenceClick----->"+String.valueOf(preference.getKey()));// 對(duì)控件進(jìn)行操作operatePreference(preference);return false;}//點(diǎn)擊事件觸發(fā)public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) {Log.i(TAG, "onPreferenceTreeClick----->"+preference.getKey());// 對(duì)控件進(jìn)行操作operatePreference(preference);if (preference.getKey().equals("wifi_setting")) {// 創(chuàng)建一個(gè)新的Intent,// 函數(shù)如果返回true, 則跳轉(zhuǎn)至該自定義的新的Intent ;// 函數(shù)如果返回false,則跳轉(zhuǎn)至xml文件中配置的Intent ;Intent i = new Intent(HelloPreference.this, OtherActivity.class); //OtherActivity只是一個(gè)簡(jiǎn)單的Activityi.putExtra("type", "wifi");startActivity(i);return true;}return false;}// 當(dāng)Preference的值發(fā)生改變時(shí)觸發(fā)該事件,true則以新值更新控件的狀態(tài),false則do notingpublic boolean onPreferenceChange(Preference preference, Object objValue) {Log.i(TAG, "onPreferenceChange----->"+String.valueOf(preference.getKey()));if (preference == mapply_wifiPreference){Log.i(TAG, "Wifi CB, and isCheckd = " + String.valueOf(objValue));}else if (preference.getKey().equals("apply_internet")) {Log.i(TAG, "internet CB, and isCheckd = "+ String.valueOf(objValue));return false; //不保存該新值}else if (preference == depart_valuePreference){Log.i(TAG, " Old Value"+ depart_valuePreference.getValue()+" NewDeptName"+objValue);}else if (preference.getKey().equals("wifi_setting")) {Log.i(TAG, "change" + String.valueOf(objValue));mwifi_settingPreference.setTitle("its turn me."); //重新設(shè)置title} else if (preference == number_editPreference) {Log.i(TAG, "Old Value = " + String.valueOf(objValue));return false; // 不保存更新值}return true; //保存更新后的值} }Demo中preference.xml的布局文件如下: <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><PreferenceCategory android:title="我的位置"android:key="set_local" /><CheckBoxPreference android:key="apply_wireless"android:title="使用無(wú)線網(wǎng)絡(luò)" android:summary="使用無(wú)線網(wǎng)絡(luò)在應(yīng)用程序(例如Google地圖)中查看位置"android:defaultValue="true"></CheckBoxPreference><CheckBoxPreference android:key="apply_gps"android:title="使用GPS" android:summary="定位到街道級(jí)別(需要消耗更多的電量以及天氣允許)"></CheckBoxPreference><PreferenceCategory android:title="無(wú)線和網(wǎng)絡(luò)設(shè)置"></PreferenceCategory><CheckBoxPreference android:key="apply_fly"android:title="飛行模式" android:summary="禁用所有無(wú)線連接" ></CheckBoxPreference><CheckBoxPreference android:key="apply_internet"android:title="Internet共享" android:summary="禁用通過(guò)USB共享Internet連接"></CheckBoxPreference><CheckBoxPreference android:key="apply_wifi"android:title="Wi-Fi" android:summary="打開(kāi)Wi-Fi"></CheckBoxPreference><Preference android:key="wifi_setting" android:title="Wi-Fi設(shè)置"android:summary="設(shè)置和管理無(wú)線接入點(diǎn)" android:dependency="apply_wifi"><!-- 點(diǎn)擊時(shí) 自定義一個(gè)默認(rèn)跳轉(zhuǎn)Intent action指定隱式Intent --><!-- action指定隱式Intent ; targetPackage和targetClass指定顯示Intent--><intent android:action="com.feixun.action.seemAction"android:targetPackage="com.feixun.qin" android:targetClass="com.feixun.qin.MainActivity" /></Preference><CheckBoxPreference android:key="apply_bluetooth"android:title="藍(lán)牙" android:summary="啟用藍(lán)牙"></CheckBoxPreference><Preference android:key="bluetooth_setting" android:title="藍(lán)牙設(shè)置"android:summary="管理連接、設(shè)備設(shè)備名稱和可檢測(cè)性" android:dependency="apply_bluetooth"></Preference><EditTextPreference android:key="number_edit"android:title="輸入電話號(hào)碼" android:defaultValue="123"></EditTextPreference><ListPreference android:key="depart_value"android:title="部門設(shè)置" android:dialogTitle="選擇部門" android:entries="@array/department"android:entryValues="@array/department_value"></ListPreference><RingtonePreference android:key="ring_key"android:title="鈴聲" android:ringtoneType="all" android:showDefault="true"android:showSilent="true"></RingtonePreference> </PreferenceScreen>
轉(zhuǎn)載于:https://www.cnblogs.com/DswCnblog/archive/2012/10/24/2737136.html
總結(jié)
以上是生活随笔為你收集整理的Android Prefence 总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三只松鼠app
- 下一篇: RHEL6 LAMT TOCAT与APA