天天看點

Android PreferenceActivity簡介

好了,我們看到Android系統本身就大量用到了PreferenceActivity來對系統進行資訊配置和管理,那麼它是怎麼儲存資料的呢,如何建立PrefenceActivity的呢,更關鍵是怎樣觸發相應事件的呢。

         先看第一個問題,PreferenceActivity是如何儲存的資料。對Android系統了解的都知道,Android系統有四種基本的資料儲存方法,一是SharedPreference,二是檔案,三是SQLite,四是ContentProvider。看出來了吧,Preference,對就是使用SharedPreferneces以鍵值對的形式進行儲存的,當然,我們也可以通過SharedPreferences來擷取PreferenceActivity設定的值。

         第二個問題:如何建立一個PreferenceActivity。 其實Eclipse提供了相應的建立工具,和建立Layout是基本相同的。步驟如下:

        建立Android項目,并添加一個Android xml檔案。注意,這次選擇的不是Layout,而是Preference,而且注意Folder路徑是 res/xml.

Android PreferenceActivity簡介

添加完成之後,在res/xml/下打開添加的preference.xml檔案。可以看到Android也為我們提供兩種編輯模式,可視化的結構設計及xml源碼設計。推薦使用structure進行建立。如圖所示:

Android PreferenceActivity簡介

下面我們看看PrefeneceActivity都提供了哪幾種元素可供使用。點選Add按鈕,在打開的新視窗中可以看到以下幾項:

Android PreferenceActivity簡介

CheckBoxPreference:CheckBox選擇項,對應的值的ture或flase。如圖:

Android PreferenceActivity簡介

EditTextPreference:輸入編輯框,值為String類型,會彈出對話框供輸入。

Android PreferenceActivity簡介

ListPreference: 清單選擇,彈出對話框供選擇。

Android PreferenceActivity簡介

Preference:隻進行文本顯示,需要與其他進行組合使用。

Android PreferenceActivity簡介

PreferenceCategory:用于分組。效果如下:

Android PreferenceActivity簡介

PreferenceScreen:PreferenceActivity的根元素,必須為它。

RingtonePreference:系統玲聲選擇。

Android PreferenceActivity簡介

OK,Preferenc的基本元素介紹完畢,下一節将使用它們建立一個完整的Preference并進行顯示。

-------------------------------------------------------------------------------

分析MusicPlayer Setting,第一部分為“我的位置”,包括“使用無線網線”和“使用GPS”兩個部分,而且都是CheckBox,根據上節學習,應該包括一個PreferenceCategory和兩個CheckBoxPreference。

Xml代碼:

複制到剪貼闆  XML/HTML代碼
  
  
           
  1. <PreferenceCategory android:title="我的位置" android:key="set_local">  
  2.     <CheckBoxPreference android:key="apply_wifi"  
  3.         android:summary="使用無線網絡在應用程式(例如Google地圖)中檢視位置"   
  4.                 android:title="使用無線網絡" android:defaultValue="true">  
  5.     </CheckBoxPreference>  
  6.     <CheckBoxPreference android:key="apply_gps"  
  7.         android:summary="定位到街道級别(需要消耗更多的電量以及天氣允許)"   
  8.                 android:title="使用GPS">  
  9.     </CheckBoxPreference>  
  10. </PreferenceCategory>  

以上代碼當然也可以用Android提供的IDE工具直接生成。視訊結構如下:

Android PreferenceActivity簡介

PreferenceCategory屬性分析:

         title:顯示的标題

         key:唯一辨別(至少在同一程式中是唯一),SharedPreferences也将通過此Key值進行資料儲存,也可以通過key值擷取儲存的資訊 (以下相同)。

CheckBoxPreference屬性分析:

        Key:唯一辨別.

        title:顯示标題(大字型顯示)

       summary:副标題(小字型顯示)

       defaultValue:預設值(當然,此處隻能是true或false了)

Preference.xml的第二部分為“無線和網絡設定”,此部分包括的内容比較多,也稍微複雜,一步一步來分析。

xml代碼:

複制到剪貼闆  XML/HTML代碼
   
   
            
  1. <PreferenceCategory android:title="無線和網絡設定">  
  2.     <CheckBoxPreference android:key="apply_fly"  
  3.         android:summary="禁用所有無線連接配接" android:title="飛行模式">  
  4.     </CheckBoxPreference>  
  5.     <CheckBoxPreference android:key="apply_internet"  
  6.         android:summary="禁用通過USB共享Internet連接配接"  
  7.                 android:title="Internet共享">  
  8.     </CheckBoxPreference>  
  9.     <CheckBoxPreference android:key="apply_wifi"  
  10.         android:summary="打開Wi-Fi" android:title="Wi-Fi">  
  11.     </CheckBoxPreference>  
  12.     <Preference android:summary="設定和管理無線接入點" android:title="Wi-Fi設定"  
  13.         android:dependency="apply_wifi" android:key="wifi_setting">  
  14.     </Preference>  
  15.     <CheckBoxPreference android:key="apply_bluetooth"  
  16.         android:summary="啟用藍牙" android:title="藍牙">  
  17.     </CheckBoxPreference>  
  18.     <Preference android:summary="管理連接配接、裝置裝置名稱和可檢測性"  
  19.         android:title="藍牙設定" android:dependency="apply_bluetooth"  
  20.         android:key="bluetooth_setting">  
  21.     </Preference>  
  22.     <EditTextPreference android:key="number_edit"  
  23.         android:title="輸入電話号碼">  
  24.     </EditTextPreference>  
  25.     <ListPreference android:title="部門設定" android:entries="@array/department"  
  26.             android:entryValues="@array/department_value"   
  27.                         android:dialogTitle="選擇部門"  
  28.             android:key="depart_value">  
  29.     </ListPreference>  
  30.     <RingtonePreference android:ringtoneType="all" android:title="玲聲"   
  31.                             android:showDefault="true" android:key="ring_key"  
  32.                             android:showSilent="true">  
  33.     </RingtonePreference>  
  34. </PreferenceCategory>  

對應的Structure圖:

Android PreferenceActivity簡介

第二部分中前三個都為CheckBoxPreference,不心多說,從<Preference android:key="bluetooth_setting"/>開始。

Preference屬性分析:

       Key:唯一辨別.

        title:顯示标題(大字型顯示)

       summary:副标題(小字型顯示)

     dependency:附屬(嘛意思),即辨別此元素附屬于某一個元素(通常為CheckBoxPreference),dependency值為所附屬元素的key。上面代碼中的Preference元素附屬于key等于“apply_bluetooth”的CheckPreference元素,當CheckPreference值為true時,Preference則為可用,否則為不可用。

EditTextPreperence屬性分析:

    Key:唯一辨別.

     title:顯示标題(大字型顯示)

ListPreference屬性分析:

   Key:唯一辨別.

   title:顯示标題(大字型顯示)

  dialogTitle:彈出對話框的标題

 entries:清單中顯示的值。為一個數組,通讀通過資源檔案進行設定。

entryValues:清單中實際儲存的值,也entries對應。為一個數組,通讀通過資源檔案進行設定。以下代碼顯示的是arrays.xml檔案中内容:

複制到剪貼闆  XML/HTML代碼
    
    
             
  1. <resources>  
  2.     <string-array name="department">  
  3.         <item>綜合部</item>  
  4.         <item>行政部</item>  
  5.         <item>外貿部</item>  
  6.     </string-array>  
  7.     <string-array name="department_value">  
  8.         <item>001</item>  
  9.         <item>002</item>  
  10.         <item>003</item>  
  11.     </string-array>  
  12. </resources>  

RingtonePreference :玲聲(暫時沒有用到過),暫時略過。

OK,Preference.xml内容已經分析完畢,屬性都大緻相同,相信親自動力一試也就那麼回事。那麼如何把Preference.xml中内容展現出來呢?

Layout是通過繼續自Activity的類來進行顯示的,前面提到過,PreferenceActivity是專門用于顯示preference的,是以隻要建立一個繼承自PreferenceActivity類即可。代碼如下:

複制到剪貼闆  Java代碼
   
   
            
  1. public class Setting extends PreferenceActivity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         // 所的的值将會自動儲存到SharePreferences  
  6.         addPreferencesFromResource(R.xml.preference);  
  7.     }  
  8. }  

接下來就是運作程式,顯示勞動成果。至此,工作已經完成大半,所有的值都會儲存到SharedPreferences中,我們也可以讀取到儲存的結果。

還有一個重要的問題,就是如何響應PreferenceActivity的操作。其實隻要重寫PreferenceActivity的 onPreferenceTreeClick的方法就可以了,通過參數preference來判斷是對那一個元素進行的,并根據需要進行操作。

複制到剪貼闆  PHP代碼
   
   
            
  1. @Override  
  2. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,  
  3.         Preference preference) {  
  4.     return false;  
  5. }

其實 關于PreferenceActivity 問題 基本結束了 但是 初次使用 會碰到一些坎坷 現一一讨論

4. 監聽設定變化問題    普通布局裡的監聽  比較簡單 先通過findViewById()獲得目标View  再在其上注冊監聽器即可

但是 PreferenceActivity 并沒有提供findViewById()  也就無法監聽 那麼 怎麼做呢?   

- 得到SharedPreferences 句柄

  1. sp = PreferenceManager.getDefaultSharedPreferences(this);

複制代碼

- 在 sp 之上注冊改變監聽器

  1. sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener(){
  2. @Override
  3. //sharedPreferences:句柄
  4. //key: 改變 鍵值
  5. public void onSharedPreferenceChanged(
  6. SharedPreferences sharedPreferences, String key) {
  7. // TODO Auto-generated method stub
  8. if(key.equals("autoBack")){
  9. Boolean autoBack = sharedPreferences.getBoolean("autoBack", false);
  10. if(autoBack){
  11. Log.d("TAG","autoBack: true!");
  12. }
  13. else {
  14. Log.d("TAG","autoBack: false!");
  15. }
  16. }
  17. }
  18. });

複制代碼

5. Preference 異地使用 即:PreferenceActivity 在一個應用程式 而别處應用程式可能也想改變該資料   怎麼做呢?

- 通過getSharedPreferences()  得到SharedPreferences執行個體

  1. spc = this.getSharedPreferences("com.android.PreferenceActivity.Usage_preferences.xml", MODE_WORLD_READABLE );

複制代碼

- 取值

  1. Boolean autoBack = spc.getBoolean("autoBack", false);

複制代碼

- 指派

  1. public void putValue(String key, Boolean value){
  2. spe = spc.edit();
  3. spe.putBoolean(key, value);
  4. spe.commit();
  5. }

複制代碼

就這樣結束 似乎感覺不爽 是以決定加點料

- ListPreference 使用

  1. <ListPreference
  2. android:key="list1"
  3. android:title="android forum"
  4. android:summary="開發論壇"
  5. android:dialogTitle="請選擇論壇"
  6. android:entries="@array/entries_list_preference"
  7. android:entryValues="@array/entriesvalue_list_preference"
  8. />

複制代碼

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="entries_list_preference">
  4. <item>www.anddev.org</item>
  5. <item>www.eoeandroid.com</item>
  6. <item>developer.android.com</item>
  7. </string-array>
  8. <string-array name="entriesvalue_list_preference">
  9. <item>1</item>
  10. <item>2</item>
  11. <item>3</item>
  12. </string-array>
  13. </resources>

複制代碼

Android PreferenceActivity簡介

2010-11-8 18:11 上傳 下載下傳附件 (23.14 KB)  

EditTextPreference 使用

  1. <EditTextPreference
  2. android:key="et1"
  3. android:title="EditTextPreference Sample"
  4. android:summary="點選輸入"
  5. android:dialogTitle="輸入設定"
  6. android:defaultValue="Hello EditTextPreference"
  7. />