閱讀973 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android 自定義ListPreference

自定義sharepreference UI

https://www.cnblogs.com/youxilua/archive/2012/03/02/2377754.html

原來自定義很簡單!

public class CameraTypeListPreference extends ListPreference {

	
	public CameraTypeListPreference(Context context) {
		super(context);
	}
	
	public CameraTypeListPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public void setValue(String value) {
		// TODO Auto-generated method stub
		super.setValue(value);
		Log.d("lzx", "setValue  " + value);
	}
	
		
	@Override
	protected void onDialogClosed(boolean positiveResult) {
		// TODO Auto-generated method stub
		super.onDialogClosed(positiveResult);
		Log.d("lzx", "onDialogClosed  getValue " + getValue());
		Log.d("lzx", "onDialogClosed  getKey " + getKey());
		Log.d("lzx", "positiveResult  " + positiveResult);
		if(getEntry() != null){
			Log.d("lzx", "onDialogClosed  getEntry " + getEntry());
		}
		if(positiveResult){
			String value = getValue();
			Log.d("lzx", "save data  "+ value);
			if(!TextUtils.isEmpty(value)){
				getEditor().putInt(getKey(), Integer.valueOf(value)).commit();
				getEditor().putInt("lzx", 999).commit();
			}
				
		}
	}
}







前言

  android對於小數據的存儲,提供了一個很好的框架就是Sharepreference,但是,我們在做項目的時候會發現,官方自帶的sharepreference 的UI 是遠遠滿足不了我們的需要(例如,設置備份時間等),這個時候,就需要我們定製一個sharepreference UI,上網找了一下,發現,這方麵的資料不多,不知道,是不是我用的關鍵字不對,導致,一直google 不出來…於是,我DEBUG 一下源碼, 把大致的方法給debug 出來…

1.從源代碼裏麵找線索之一

(1)官方的Sharepreference UI

share

從上圖可以看出,官方用於做sharepreference 的UI 就隻有5個而已,遠遠不能滿足我們的需要,於是,我們就要想辦法定製一個.(注意:MultiSelectListPreference(api 11 以後才支持..))

(2) 定製一個Sharepreference UI

1,效果圖

麥庫截圖20120302191811

2,怎麼做?

首先,我們看一下實現的類圖:(從左往右)

share2

(1)上麵的例子是一個對話框交互的首選項設置,於是,我就繼承了DialogPreference,當然,如果隻是開關設置的話,就請繼承TwoStatePreference,如果,這兩個,都滿足不了你的需要,你可以選擇直接繼承Preference.

 

(2) 接下來,我們就是定製我們的Preference UI

關於定製

1,你可以直接使用代碼

2,你可以寫布局文件

 

這裏,我選擇寫一個布局文件,就是效果圖的那樣了…

然後在構造方法中這樣寫:

1
2
3
4
5
6
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 流程圖

share3

從上圖可知,我們啟動PreferenceActivity的時候,會初始化所有Preference UI,這就是為什麼我們要把布局文件寫在構造方法當中的原因.

(2) 調用過程

1,點擊我們的UI,將會調用如圖所示的方法

share4

2,點擊確定或者取消以後,就會調用onDialogClosed,如下圖所示

share4

與我們使用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);
		}
	}

 

截個小圖來表示一下:

麥庫截圖20120302204715

順便給個建議,如果上網找不到資料的話,直接debug 源碼,從源碼中找出規律不失為一個好辦法..


最後更新:2017-04-04 07:03:42

  上一篇:go jdbc實現篇-源碼(Oracle、MySQL)之Connection創建過程
  下一篇:go POJ 2992 質因子分解