天天看點

Android資料存儲(二)----PreferenceFragment詳解

【正文】

一、preferencefragment的引入:

preferenceactivity是一個非常有用的基類,當我們開發android項目時避免不了選項設定,這些設定習慣用preference來儲存。android專門為這種activity提供了便捷的基類preferenceactivity。如果繼承自preference則不需要自己控制preference的讀寫,preferenceactivity會為我們處理一切。

preferenceactivity與普通的activity不同,它不是使用界面布局檔案,而是使用選項設定的布局檔案。

選項設定布局檔案以preferencescreen作為根元素來表示定義一個參數設定界面布局。

從android 3.0以後官方不再推薦直接讓preferenceactivity加載選項設定布局檔案,而是建議使用preferencefragment,二者用法類似。是以今天就來學習一下。

下面的這張截圖就是一個典型的例子:

Android資料存儲(二)----PreferenceFragment詳解

我們會看到整個頁面被分為幾組:無線和網絡、個人、賬戶、裝置、系統。這個分組(或者叫分類)就是preferencecategory。

wifi右邊有開關,這一項就是checkboxpreference;其他還有listpreference和edittextpreference。

你的每一次設定,都會被preference自動儲存下來,這就是setting的資料持久化。每個preference都是以鍵值對的形式儲存下來的。

preferenceactivity的繼承關系圖:(不推薦使用)

Android資料存儲(二)----PreferenceFragment詳解

preferencefragment的繼承關系圖:(推薦使用)

Android資料存儲(二)----PreferenceFragment詳解

二、在xml檔案中preference的種類:

根節點中一定是<preferencescreen> 元素,在這個元素中可以添加不同的preference。常見的preference控件有:

直接子類:dialogpreference, preferencegroup, ringtonepreference, twostatepreference

非直接子類:checkboxpreference, edittextpreference, listpreference, multiselectlistpreference, preferencecategory, preferencescreen, switchpreference

我們還是通過實際的例子來實作吧。 

【執行個體】

先建立一個工程檔案:

Android資料存儲(二)----PreferenceFragment詳解

建立類preffragment.java,讓其繼承preferencefragment,并加載選項設定的布局檔案:(核心代碼是第6行和13行)

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

然後,在mainactivity.java中加載上面的fragment:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

接下來的知識就是重頭戲了,既然preffragment要加載選項設定的布局檔案r.xml.preferences,那我們就來定義一下這個preferences.xml:

在res目錄下建立立一個xml目錄,在該目錄中建立檔案preferences.xml:

Android資料存儲(二)----PreferenceFragment詳解

關于preferences.xml的檔案裡面的代碼,請看下面這一段。

五、preference詳解:

1、<preferencecategory>的方式進行分組:

preferences.xml舉例如下:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

上方代碼中,一個<preferencecategory>就是一個類别,單個的<preferencecategory>可以放入任意的preference控件。我們在第一個類别中放入了checkboxpreference控件,在第二個類别中放入了edittextpreference控件。運作效果如下:

Android資料存儲(二)----PreferenceFragment詳解

運作時候,會自動在/data/data/<packagename>/shared_prefs/目錄生成一個文本檔案:

Android資料存儲(二)----PreferenceFragment詳解

注:這個文本的檔案名太長了,我們可以在上方preffragment.java的第13行代碼後面加上這樣一句話來修改檔案名:(這裡我将檔案名修改為:mysetting)

文本内容如下:

Android資料存儲(二)----PreferenceFragment詳解

我們現在在checkboxpreference中打鈎,然後在edittextpreference中輸入内容:

Android資料存儲(二)----PreferenceFragment詳解

文本内容顯示如下:

Android資料存儲(二)----PreferenceFragment詳解

2、顯示子螢幕subscreens方式的進行分組:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

運作效果如下:

Android資料存儲(二)----PreferenceFragment詳解

點選上方第一個preference,進入下圖中左側界面;點選上方第二個preference,進入下圖中右側界面。效果如下:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

3、listpreference控件:

點選該控件後,将列出一個單選按鈕的清單。用法如下:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

上方代碼中,preferencescreen為根标簽,listpreference為子标簽。listpreference的常見屬性如下:

android:key 唯一辨別符,和android:id相類似,preferencemanager可以以其為參數通過findpreference擷取指定的preference 。 注意,這個android:key的值也是preference檔案裡面的xml“鍵”名

android:title 大标題

android:summary 标題下面的小字(這個要作為頁籤才有)

android:entries 彈出的對話框中,清單顯示的文本内容,注意哦,這裡指定的是一個數組。

android:entryvalues 與android:entries相對應的值

android:defaultvalue 當對應值不存在時的預設值

android:dialogtitle 彈出的對話框中的标題資訊

關于android:entries和android:entryvalues的差別,要強調一下:

android:entries:the human-readable array to present as a list. 是展現給使用者的清單的值。

android:entryvalues :he array to find the value to save for a preference when an entry from entries is selected. 展現的使用者的選擇清單的每個元素選擇後,需要存儲到手機中,這裡的entryvalues就是清單中各個元素被選擇後存儲到手機中的值(通過sharedpreferences儲存在/data/data/<packagename>/shared_prefs/目錄下)。簡單的說就是此處是資料庫中的值。上面的android:entries是展現給使用者的清單的值。

我們在上方代碼中的第13、14行引用了資料,緊接着我們要在values目錄下的strings.xml檔案中定義這個被引用的城市清單(即資料來源):

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

上方代碼中,8至12行:即加粗部分,是我添加的資料源。

運作程式效果如下:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

六、監聽事件onpreferencetreeclick()方法:

當任何一個preference控件被點選,都将觸發該方法。但是可以通過preference.getkey()這個方法找到具體是哪個preference被點選了,因為每個preference的key都是唯一的。

現将preferences.xml這個設定選項的布局檔案,定義如下:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

現在我們需要做的是,選中上方紅框中的checkboxpreference,對應下面的edittextpreference為編輯狀态;否則,如果checkboxpreference沒有被選中,則edittextpreference為不可編輯狀态。修改preffragment.java的代碼,其完整版代碼如下:

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

代碼解釋:

當任何一個preference控件被點選,都将觸發onpreferencetreeclick()方法(22行),但是可以通過preference.getkey()這個方法找到具體是哪個preference被點選(25行)。

26行、27行:通過public preference findpreference(charsequence key)找到對應的preference,然後強轉為它的子類。

29行:核心代碼,讓edittextpreference和checkboxpreference的狀态保持一緻。

Android資料存儲(二)----PreferenceFragment詳解
Android資料存儲(二)----PreferenceFragment詳解

這樣,我們的功能就實作了。