2010年8月4日水曜日

Android Preference の summary を動的に変更

Preference を使った設定画面で、今設定されている
値が summary に出るとユーザーフレンドリーですよね。

summary というのは、PreferenceActivity の設定画面で、
設定項目の下に少し小さい文字で表示される領域です。

Libraroid の設定画面だと、「和書」「キーワード」
「キーワードに関連」などのが表示されるところが summary です。




選択された値によって、この summary に表示される
文字を変更するにはこんな感じで実装します。

PreferenceActivity で

  1. Preference searchbooksPref;  
  2.   
  3. final static String SEARCHBOOKS_KEY = "searchbooks";  
  4.   
  5. Map<String, String> searchbooksMap = new HashMap<String, String>();  
  6.   
  7. @Override void onCreate() {  
  8.     // 省略  
  9.     String[] searchbooksKeys       = getResources().getStringArray(R.array.search_books);  
  10.     String[] searchbooksValues     = getResources().getStringArray(R.array.search_books_value);  
  11.   
  12.     for(int i = 0; i < searchbooksKeys.length; i++)  
  13.         searchbooksMap.put(searchbooksValues[i], searchbooksKeys[i]);  
  14.   
  15.     searchbooksPref     = findPreference(SEARCHBOOKS_KEY);  
  16.     
  17.     // 省略  
  18. }  
  19.   
  20.   
  21. @Override  
  22. protected void onResume() {  
  23.     super.onResume();  
  24.     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);  
  25. }  
  26.    
  27. @Override  
  28. protected void onPause() {  
  29.     super.onPause();  
  30.     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);  
  31. }  
  32.   
  33. // ここで summary を動的に変更  
  34. private SharedPreferences.OnSharedPreferenceChangeListener listener =   
  35.     new SharedPreferences.OnSharedPreferenceChangeListener() {  
  36.        
  37.     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  
  38.         
  39.         if(key.equals(SEARCHBOOKS_KEY))     
  40.             searchbooksPref.setSummary(searchbooksMap.get(sharedPreferences.getString(key, "Books")));  
  41.     }  
  42. };  


SharedPreferences.OnSharedPreferenceChangeListener を定義して、preference の設定値が変更されたときの処理を実装します。

このリスナーを onResume() と onPause() でレジスト/アンレジストします。

設定値が変更されたときに、どの preference が変更されたかは、onSharedPreferenceChanged の引数の key に入ってます。

ここでは、設定値が複数の項目から選択する場合(リスト)の実装です。
# 選択項目の表示 array と値 array がarray-string で resource に定義してあります。

たとえば、単に preference の設定値を表示するだけの場合は(uid を表示するとか)こんな感じでOKです。

  1. private SharedPreferences.OnSharedPreferenceChangeListener listener =   
  2.     new SharedPreferences.OnSharedPreferenceChangeListener() {  
  3.        
  4.     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  
  5.         
  6.         findPreference(key).setSummary(sharedPreferences.getString(key, "00000000"));  
  7.     }  
  8. };  



 

0 件のコメント:

コメントを投稿