Android的設置界面及Preference使用

一.基礎知識

    我們在使用Android手機時,可能會經常用到其中的設置界面,如下所示:

1 Android系統中的設置界面

    而且對於我們自己開發的一個完整的程序來說,我們也會需要給用戶提供一個設置界面使用戶可以對程序的一些參數進行設置。因此,我們就來學習下如何實現符合我們需要的一個設置界面,及其背後的數據持久化功能。

二.實例開發

2.1 SharedPreferences

    在具體介紹Android的設置界面的實現之前,我們先來介紹一下預備知識,就是Android數據持久化方法中最簡單的一種,即使用Preferences的鍵值對存儲方式。這種方式主要用來存儲比較簡單的一些數據,而且是標準的BooleanIntFloatLongString等類型。

android.content.SharedPreferences是一個接口,用來獲取和修改持久化存儲的數據。有三種獲取系統中保存的持久化數據的方式:

1. public SharedPreferences getPreferences (int mode)

    通過Activity對象獲取,獲取的是本Activity私有的Preference,保存在系統中的xml形式的文件的名稱爲這個Activity的名字,因此一個Activity只能有一個,屬於這個Activity

2. public SharedPreferences getSharedPreferences (String name, int mode)

    因爲Activity繼承了ContextWrapper,因此也是通過Activity對象獲取,但是屬於整個應用程序,可以有多個,以第一參數的name爲文件名保存在系統中。

3. public static SharedPreferences getDefaultSharedPreferences (Context context)

    PreferenceManager的靜態函數,保存PreferenceActivity中的設置,屬於整個應用程序,但是隻有一個,Android會根據包名和PreferenceActivity的佈局文件來起一個名字保存。

    通過以上方式取得SharedPreferences後就可以對數據進行讀取或者保存了。

    保存方式如下:

 

    獲得SharedPreferences,如果需要進行保存等修改操作,首先得通過其edit()方法獲得SharedPreferences.Editor,然後就可以通過putIntputString等方法以鍵值對(key-value)的方式保存數據,或者remove移除某個鍵(key),及調用clear方法刪除所有內容。最後需要調用commit方法是使修改生效。

    讀取方式如下:

 

    讀取就更加簡單了,只要獲得SharedPreferences後,就可以通過getIntgetString等方法獲取對應鍵(key)保存着的數據,如果沒有找到key,則返回第二個參數作爲默認值。

2.2 PreferenceActivity

    上面介紹SharedPreferences鍵值對保存的基礎知識,接着我們就可以來實現Android系統的設置界面。Android系統中和設置界面相關的包爲android.preference,其中有一個繼承了ListActivityPreferenceActivity

下面我們就先實現一個如下圖2的最簡單的PreferenceActivity設置界面,只有一個CheckBox選擇選項,選中時顯示“Yes,I love you!”,取消選擇時顯示“No,I am sorry.”。然後再介紹其具體的實現。

2 PreferenceActivity界面

    首先新建一個工程AndroidPreferenceDemo

    把extends Activity改爲extends PreferenceActivity

    在res目錄下新建一個xml文件夾,接着在這個文件夾下新建一個取名爲preferences.xmlFile文件,內容如下:

 

    然後把java文件中的setContentView(R.layout.main);改爲

addPreferencesFromResource(R.xml.preferences);

    完成了,最後可以運行試下效果。

 

    Java文件的實現很簡單,繼承PreferenceActivity後,調用其public void addPreferencesFromResource (int preferencesResId)

方法從一個xml文件中獲取preference然後顯示爲標準的設置界面。

    因此我們只要在xml文件中佈局好要顯示的設置界面內容就可以了。

    下面我們看下佈局文件xml的內容。

    對應的xml中可以使用的標籤(Tag)可以分爲兩類,一類是管理佈局的顯示,如PreferenceScreen;另一類是具體的設置內容,如CheckBoxPreference

PreferenceScreen可以顯示一個完整的頁面,可以嵌套,包含在PreferenceScreen標籤裏的內容都將以一個完整的頁面顯示。

    我們學習一個PreferenceScreen的界面,如下圖3所示。

PreferenceScreen相關的佈局

    當點擊左圖的選項時,分別會以新的頁面顯示,如中間和右圖所示。

    上面頁面對應的xml佈局文件如下所示:

 

    和管理佈局顯示相關的除了PreferenceScreen外,還有一個常用的爲PreferenceCategory,我們把上面xml文件中間那兩個PreferenceScreen改爲PreferenceCategory就可以看到PreferenceCategory的顯示效果了,如下圖4所示。

PreferenceCategory相關的佈局

    可以看到PreferenceCategory是把包含的內容歸爲同一類,但只是顯示在一個頁面中。


    管理佈局相關的兩個標籤可以使設置內容顯示的更有條理,但是更主要的還是具體設置相關的標籤,除了我們已經在使用的用於二選一的CheckBoxPreference外,Android系統提供的還有以對話框顯示的DialogPreference,可以輸入文本的EditTextPreference,以列表方式顯示供選擇的ListPreference和設置鈴聲用的RingtonePreference

下面我們選擇比較常用的ListPreference來介紹下具體使用。

首先在res/values/文件夾下新建一個取名爲array.xml的文件,內容爲:

 

    然後在res/values/strings.xml文件中添加

 

    需要的數據現在準備好了,下面我們來完成對應的xml文件。xml文件中各個標籤的屬性比較多,雖然Android有代碼自動補全功能,但是還是使用Android提供的Structure界面來填寫比較方便,下面我們就以這個方式來完成。

    在res/xml文件夾下新建一個Android XML File文件,取名爲preferencesii.xml,類型選擇PreferenceRoot Element選擇PreferenceScreen。          在Structure方式顯示時,就會列出選中標籤的所有屬性,然後就可以根據需要填寫屬性,如下圖5所示:

填寫xmlPreference的屬性

    從上圖我們可以看到一個Preference擁有的屬性。其中Key爲這個PreferenceID,設置了纔可以在代碼中引用,Title是顯示的標題,Summary是顯示在標題下的文字介紹, 一般在Dependency中填寫一個CheckBoxPreferenceKey,這樣就會在填寫的那個CheckBoxPreference勾選時當前這個Preference纔可用,Default Value爲初始值,等等。

    點擊“Add”按鈕,就會添加新的標籤,我們依次添加一個CheckBoxPreferenceListPreference。屬於CheckBoxPreference的特有屬性主要爲Summary OnSummary Off,比較好理解。下面具體來看下ListPreference屬性的填寫:

6 ListPreference的屬性

    我們可以看到,ListPreference除了繼承自Preference的屬性外,還有自己ListPreference的屬性和繼承自DialogPreference的屬性。其中屬於ListPreference的屬性有兩個:Entries填的爲一個字符串數組,是列表顯示出來的值,而Entry Values是長度對應的字符串數組,是和Entries對應的具體的值。DialogPreference只要填一個Dialog title標題和一個取消按鈕顯示的字即可。在Preference屬性的Dependency中我們填寫上面一個CheckBoxPreferenceKey,這樣就會只有在CheckBoxPreference勾選時這個ListPreference纔有效。

完整的xml顯示

    最後把java文件中的addPreferencesFromResource(R.xml.preferences);改爲addPreferencesFromResource(R.xml.preferencesii);

    保存運行,看下效果。

8 ListPreference顯示

2.3 OnPreferenceChangeListener

    以上我們分別介紹了Preference對數據的保存及PreferenceActivity設置界面。當PreferenceActivity中的內容改變時,Android系統會自動進行保存和持久化維護,我們只需要在要用的設置界面中數據的地方進行讀取就可以了。同時Android還提供了OnPreferenceClickListenerOnPreferenceChangeListener兩個與Preference相關的監聽接口,當PreferenceActivity中的某一個Preference進行了點擊或者改變的操作時,都會回調接口中的函數,這樣可以第一個時間向其他Activity等通知系統設置進行了改變。

下面我們以一個具體的Demo說明PreferenceActivity和其監聽接口的使用。

    新建一個工程AndroidPreferenceDemoII,並按上面的步驟添加xml文件夾和其內容Preferenceii.xml,還有values文件夾中的array.xmlstrings.xml

    新建一個名爲Settingsclass,內容爲:

 

    主要是獲取xml文件中的各個Preference,然後爲其註冊監聽接口,最後在監聽接口的回調函數中打印相關的信息。

    接着在Manifest文件中對這個Activity進行註冊:

 

    然後對AndroidPreferenceDemoII.java文件進行如下修改:

 

    主要是添加一個設置菜單,點擊後轉到設置界面,當從設置界面返回後讀取保存的內容,並打印出來查看。

    最後我們看一下運行的效果:

設置界面操作

    操作的Log輸出如下圖10所示:

 

10 DDMSLogCat輸出

 

    點擊設置菜單轉到設置界面後,首先點擊CheckBox,輸出前6行,然後點擊ListPreference,輸出3行,當選擇列表的第二個進行改變時,再輸出3行,最後按返回鍵回到第一個頁面,打印出最後2行。

 

    最後我們看一下這些設置參數在系統中的保存文件。在DDMSFile Explorer中,查看data/data/com.ichliebephone文件夾,我們可以看到有如下文件:

11 Preference保存的文件

 

    把這個文件導出到電腦上,可以看到起內容爲:

 

    文件以map的方式保存了兩個設置參數

三.總結

    我們學習了AndroidPreference相關內容,包括最基本的SharedPreferences的使用,及進一步的PreferenceActivity設置界面的介紹,最後根據以上的內容完成了一個簡單的Demo

    Preference鍵值對的方式是Android最簡單的一種數據持久化方式,雖然比較簡單,但是也比較實用,特別是在保存小量的數據時。Android上的功能更加強大相對也更加複雜的SQLite數據保存方式我們以後接着學習。

 

 

文章對應的完整代碼例子可以在這裏下載:

http://download.csdn.net/source/2728956

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章