前言
android對于小資料的存儲,提供了一個很好的架構就是Sharepreference,但是,我們在做項目的時候會發現,官方自帶的sharepreference 的UI 是遠遠滿足不了我們的需要(例如,設定備份時間等),這個時候,就需要我們定制一個sharepreference UI,上網找了一下,發現,這方面的資料不多,不知道,是不是我用的關鍵字不對,導緻,一直google 不出來…于是,我DEBUG 一下源碼, 把大緻的方法給debug 出來…
1.從源代碼裡面找線索之一
(1)官方的Sharepreference UI <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692792CHcp.png"></a> 從上圖可以看出,官方用于做sharepreference 的UI 就隻有5個而已,遠遠不能滿足我們的需要,于是,我們就要想辦法定制一個.(注意:MultiSelectListPreference(api 11 以後才支援..)) (2) 定制一個Sharepreference UI 1,效果圖 <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692793l6Ck.jpg"></a> 2,怎麼做? 首先,我們看一下實作的類圖:(從左往右) <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692793fkQy.png"></a> (1)上面的例子是一個對話框互動的首選項設定,于是,我就繼承了DialogPreference,當然,如果隻是開關設定的話,就請繼承TwoStatePreference,如果,這兩個,都滿足不了你的需要,你可以選擇直接繼承Preference. (2) 接下來,我們就是定制我們的Preference UI 關于定制 1,你可以直接使用代碼 2,你可以寫布局檔案 這裡,我選擇寫一個布局檔案,就是效果圖的那樣了… 然後在構造方法中這樣寫: public TimeSettingPreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.preference_timesetting); } 接着,在sharepreference配置的xml 加上 <com.achai.shop.preferences.TimeSettingPreference android:key="@string/shop_infor_name" android:title="@string/shop_infor_name" /> 這樣就完成了,對于sharepreference 自定義UI的配置.
2.從源代碼裡面找線索 之二
隻是,完成了一個UI是遠遠不夠的,我們還需要把我們設定的值,存進SharePreference這個架構裡面! 以下内容,可能比較啰嗦… FAQ: 1, 我們怎麼控制DialogPreference和我們一直用的AlertDialog控件的方法一樣嗎? 2, 怎麼把值存進Sharepreference 裡面? (1),第一次啟動PreferenceActivity 流程圖 <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692794zgkp.png"></a> 從上圖可知,我們啟動PreferenceActivity的時候,會初始化所有Preference UI,這就是為什麼我們要把布局檔案寫在構造方法當中的原因. (2) 調用過程 1,點選我們的UI,将會調用如圖所示的方法 <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692795zr0d.png"></a> 2,點選确定或者取消以後,就會調用onDialogClosed,如下圖所示 <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692795CKGL.png"></a> 與我們使用alertDialog 不同的是,DialogPreference 關閉的時候,統一調用onDialogClosed(boolean positiveResult)方法,确認還是取消,隻要進行判斷即可. x 至此,我們搞清楚了,這個Dialogpreference 整個運作流程,接下來得問題是,怎麼綁定我們的控件呢? onCreateDialog() || onBindDialogView(View view) ? 如果,你的控件是寫在xml 裡面當中的,你就隻能用onBindDialogView,一般而言我們不重寫onCreateDialog()… 總結: 如果,你用的是DialogPreference,僅僅能用你至少需要重寫: onBindDialogView(View view) onDialogClosed(boolean posittiveResult) 為了你的程式寫得更好,你除了重寫以上方法以外還需要重寫 onSetInitialValue(boolean restoreValue, Object defaultValue) onSaveInstanceState() onRestoreInstanceState(Parcelable) 接下來,我們就要把我們的值,存進Sharepreference裡面
3.從源代碼裡面找線索 之三
這部分内容,就要把我們的值存到sharepreference裡面,其實很簡單.. 1,在onDialogClosed 寫好要儲存的方式 @Override protected void onDialogClosed(boolean positiveResult) { // TODO Auto-generated method stub super.onDialogClosed(positiveResult); if (positiveResult) { setTime(); } } 2,寫我們的setTime()方法即可.. private void setTime() { // shopStart.gett @SuppressWarnings("unused") //檢查是否需要關閉依賴... final boolean wasBlocking = shouldDisableDependents(); int currentHour = shopStart.getCurrentHour(); int currentMinute = shopStart.getCurrentMinute(); //持久化值 persistString(currentHour+":"+currentMinute); //再次檢查是否需要關閉依賴... final boolean isBlocking = shouldDisableDependents(); //更新所有依賴改變 if(isBlocking != wasBlocking) { notifyDependencyChange(isBlocking); } } 截個小圖來表示一下: <a href="http://youxilua.blog.51cto.com/attachment/201203/2/3357586_1330692796q5Sr.jpg"></a> 順便給個建議,如果上網找不到資料的話,直接debug 源碼,從源碼中找出規律不失為一個好辦法.. 本文轉自 liam2199 部落格,原文連結: http://blog.51cto.com/youxilua/794733 如需轉載請自行聯系原作者