android對於小數據的存儲,提供了一個很好的框架就是Sharepreference,可是,咱們在作項目的時候會發現,官方自帶的sharepreference 的UI 是遠遠知足不了咱們的須要(例如,設置備份時間等),這個時候,就須要咱們定製一個sharepreference UI,上網找了一下,發現,這方面的資料很少,不知道,是否是我用的關鍵字不對,致使,一直google 不出來…因而,我DEBUG 一下源碼, 把大體的方法給debug 出來…html
(1)官方的Sharepreference UI java
從上圖能夠看出,官方用於作sharepreference 的UI 就只有5個而已,遠遠不能知足咱們的須要,因而,咱們就要想辦法定製一個.(注意:MultiSelectListPreference(api 11 之後才支持..))android
(2) 定製一個Sharepreference UI
1,效果圖api
2,怎麼作?框架
首先,咱們看一下實現的類圖:(從左往右)ide
(1)上面的例子是一個對話框交互的首選項設置,因而,我就繼承了DialogPreference,固然,若是隻是開關設置的話,就請繼承TwoStatePreference,若是,這兩個,都知足不了你的須要,你能夠選擇直接繼承Preference.佈局
(2) 接下來,咱們就是定製咱們的Preference UIgoogle
關於定製.net
1,你能夠直接使用代碼debug
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的配置.
只是,完成了一個UI是遠遠不夠的,咱們還須要把咱們設置的值,存進SharePreference這個框架裏面!
如下內容,可能比較囉嗦…
FAQ:
1, 咱們怎麼控制DialogPreference和咱們一直用的AlertDialog控件的方法同樣嗎?
2, 怎麼把值存進Sharepreference 裏面?
(1),第一次啓動PreferenceActivity 流程圖
從上圖可知,咱們啓動PreferenceActivity的時候,會初始化全部Preference UI,這就是爲何咱們要把佈局文件寫在構造方法當中的緣由.
(2) 調用過程
1,點擊咱們的UI,將會調用如圖所示的方法
2,點擊肯定或者取消之後,就會調用onDialogClosed,以下圖所示
與咱們使用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裏面
這部份內容,就要把咱們的值存到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); } }
截個小圖來表示一下:
順便給個建議,若是上網找不到資料的話,直接debug 源碼,從源碼中找出規律不失爲一個好辦法..