因為一些原因,我必需要寫一個動態的 Preference Screen,裡面的某幾個 Preference 需要依 Device 支援的程度,來顯示選項及預設值。
我本來以為這是一個簡單的工作…
依照我的預求,我很自然的寫了以下的程式碼:
實際上,跑起來也沒有什麼大問題。
但仔細看,問題來了,在進入Preference Screen時,可以明顯的發現,在 Summary 的欄位是沒有任何文字的!
而且,點進這個 List preference 去看,也會發現 Default 的 item 沒有被選取!
但,我的的確確有呼叫 setDefaultValue 呀!
又經過了幾次測,好吧,認命了… 在 ListPreference 裡面,setDefaultValue看起來無法在動態產生 values 時生效。
詳細的原因我還沒去研究 Framework,但我猜應該是在這個時期,資料還沒生成,所以我設的 value 對它來講還不存在,也就不能讓我設了,這部份是亂猜的,有空再研究。
但這個問題又不能不解,所以小弟就使用了以下的 solution 來暫時解決這個小問題,
提供給有需要的人使用..
分享給有需要的人。
P.S 在上面的 sample code 中 onPreferenceChangListener 的部份就請各位自己 Implement 了。
我本來以為這是一個簡單的工作…
依照我的預求,我很自然的寫了以下的程式碼:
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 了。
沒有留言:
張貼留言