Android之PreferenceActivity

來源:互聯網
上載者:User

看到很多書中都沒有對PreferenceActivity做介紹,而我在看Android Samples時無意中看見了,所以就稍微總結一下,也方便日後尋找。
PerferenceActivity是什麼,看下面的:



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


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

 

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

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

 

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



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


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


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



ListPreference: 列表選擇,彈出對話方塊供選擇。



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



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


 

PreferenceScreen:PreferenceActivity的根項目,必須為它。

RingtonePreference:系統玲聲選擇。

 

 

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

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

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

Xml代碼:


<PreferenceCategory android:title="我的位置" android:key="set_local"> <CheckBoxPreference android:key="apply_wifi" android:summary="使用無線網路在應用程式(例如Google地圖)中查看位置"
 android:title="使用無線網路" android:defaultValue="true"> </CheckBoxPreference> <CheckBoxPreference android:key="apply_gps" android:summary="定位到街道層級(需要消耗更多的電量以及天氣允許)"
 android:title="使用GPS"> </CheckBoxPreference> </PreferenceCategory>

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

 

 

PreferenceCategory屬性分析:

         title:顯示的標題

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

CheckBoxPreference屬性分析:

        Key:唯一標識.

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

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

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

 

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

xml代碼:
[html] <PreferenceCategory android:title="無線和網路設定"> 
    <CheckBoxPreference android:key="apply_fly" 
        android:summary="禁用所有無線串連" android:title="飛航模式"> 
    </CheckBoxPreference> 
    <CheckBoxPreference android:key="apply_internet" 
        android:summary="禁用通過USB共用Internet串連" 
                android:title="Internet共用"> 
    </CheckBoxPreference> 
    <CheckBoxPreference android:key="apply_wifi" 
        android:summary="開啟Wi-Fi" android:title="Wi-Fi"> 
    </CheckBoxPreference> 
    <Preference android:summary="設定和管理無線存取點" android:title="Wi-Fi設定" 
        android:dependency="apply_wifi" android:key="wifi_setting"> 
    </Preference> 
    <CheckBoxPreference android:key="apply_bluetooth" 
        android:summary="啟用藍芽" android:title="藍芽"> 
    </CheckBoxPreference> 
    <Preference android:summary="管理串連、裝置裝置名稱和可檢測性" 
        android:title="藍芽設定" android:dependency="apply_bluetooth" 
        android:key="bluetooth_setting"> 
    </Preference> 
    <EditTextPreference android:key="number_edit" 
        android:title="輸入電話號碼"> 
    </EditTextPreference> 
    <ListPreference android:title="部門設定" android:entries="@array/department" 
            android:entryValues="@array/department_value"  
                        android:dialogTitle="選擇部門" 
            android:key="depart_value"> 
    </ListPreference> 
    <RingtonePreference android:ringtoneType="all" android:title="玲聲"  
                            android:showDefault="true" android:key="ring_key" 
                            android:showSilent="true"> 
    </RingtonePreference> 
</PreferenceCategory> 
<PreferenceCategory android:title="無線和網路設定">
 <CheckBoxPreference android:key="apply_fly"
  android:summary="禁用所有無線串連" android:title="飛航模式">
 </CheckBoxPreference>
 <CheckBoxPreference android:key="apply_internet"
  android:summary="禁用通過USB共用Internet串連"
                android:title="Internet共用">
 </CheckBoxPreference>
 <CheckBoxPreference android:key="apply_wifi"
  android:summary="開啟Wi-Fi" android:title="Wi-Fi">
 </CheckBoxPreference>
 <Preference android:summary="設定和管理無線存取點" android:title="Wi-Fi設定"
  android:dependency="apply_wifi" android:key="wifi_setting">
 </Preference>
 <CheckBoxPreference android:key="apply_bluetooth"
  android:summary="啟用藍芽" android:title="藍芽">
 </CheckBoxPreference>
 <Preference android:summary="管理串連、裝置裝置名稱和可檢測性"
  android:title="藍芽設定" android:dependency="apply_bluetooth"
  android:key="bluetooth_setting">
 </Preference>
 <EditTextPreference android:key="number_edit"
  android:title="輸入電話號碼">
 </EditTextPreference>
 <ListPreference android:title="部門設定" android:entries="@array/department"
   android:entryValues="@array/department_value"
                        android:dialogTitle="選擇部門"
   android:key="depart_value">
 </ListPreference>
 <RingtonePreference android:ringtoneType="all" android:title="玲聲"
                            android:showDefault="true" android:key="ring_key"
                            android:showSilent="true">
 </RingtonePreference>
</PreferenceCategory>
對應的Structure圖:



 

第二部分中前三個都為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檔案中內容:

<resources> <string-array name="department"> <item>綜合部</item> <item>行政部</item> <item>外貿部</item> </string-array> <string-array name="department_value"> <item>001</item> <item>002</item> <item>003</item> </string-array> </resources>


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

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

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


public class Setting extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 所的的值將會自動儲存到SharePreferences addPreferencesFromResource(R.xml.preference); } }
 

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

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

@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { return false; }
 

Ok,到此關於PreferenceActvity的想關內容就完了,日後有什麼重大發現會補上。

 摘自 火山哥的專欄


 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.