站內搜尋

2011/3/13

Android Tips 開發小技巧 - 動態產生 ListPreference 選項

因為一些原因,我必需要寫一個動態的 Preference Screen,裡面的某幾個 Preference 需要依 Device 支援的程度,來顯示選項及預設值。
我本來以為這是一個簡單的工作…


依照我的預求,我很自然的寫了以下的程式碼:
    pref = (ListPreference)findPreference(KEY_PREFERENCE); 
    pref.setEntries(itemMaker()); 
    pref.setEntryValues(valueMaker()); 
    pref.setDefaultValue(valueMaker()[0]); 
    pref.setSummary(pref.getEntry()); 
    pref.setOnPreferenceChangeListener(this); 

ok, 一切看似美好,在 XML 中我也將 entries 及 entryValues 給拿掉。
實際上,跑起來也沒有什麼大問題。

但仔細看,問題來了,在進入Preference Screen時,可以明顯的發現,在 Summary 的欄位是沒有任何文字的!
而且,點進這個 List preference 去看,也會發現 Default 的 item 沒有被選取!

但,我的的確確有呼叫 setDefaultValue 呀!

又經過了幾次測,好吧,認命了… 在 ListPreference 裡面,setDefaultValue看起來無法在動態產生 values 時生效。
詳細的原因我還沒去研究 Framework,但我猜應該是在這個時期,資料還沒生成,所以我設的 value 對它來講還不存在,也就不能讓我設了,這部份是亂猜的,有空再研究。

但這個問題又不能不解,所以小弟就使用了以下的 solution 來暫時解決這個小問題,
提供給有需要的人使用..
    pref = (ListPreference)findPreference(KEY_PREFERENCE); 
    pref.setEntries(itemMaker()); 
    pref.setEntryValues(valueMaker()); 
     
    // 當我們取得 Default Value 之後,直接設進 SharedPreference 中。 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
    sp.edit().putString(KEY_PREFERENCE, valueMaker()[0]).commit(); 

    // 無效 
    //pref.setDefaultValue(valueMaker()[0]); 
    pref.setSummary(pref.getEntry()); 
    pref..setOnPreferenceChangeListener(this); 
雖然不是什麼漂亮的解法,但確實是解決掉了我的小問題。
分享給有需要的人。

P.S 在上面的 sample code 中 onPreferenceChangListener 的部份就請各位自己 Implement 了。

熱門文章