2011年12月9日金曜日

PreferenceActivity でサマリを動的に変更したい。



現在作成中のアプリでは、PreferenceActivityを利用しています。

設定した値によって、表示されている項目のサマリーが変更するとステキなので、実装をします。



こういう感じで、設定項目の下に設定値を表示したい。
具体的には、項目の内容が変更されたときのリスナーを設定し、コールバックメソッドでサマリーの内容を書き換えます。

リスナーの設定を
onResume()

で行い、解除を

onPause()


で行なっています。


 SharedPreferences.OnSharedPreferenceChangeListener listener; //設定値変更時のリスナーを保存するField
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.preference_activity);
  addPreferencesFromResource(R.xml.party_preference);
  
  //省略
  listener = setOnChangeLitener();
 }
 
 //設定値変更時のリスナークラスの定義
 private SharedPreferences.OnSharedPreferenceChangeListener setOnChangeLitener() {
  return new SharedPreferences.OnSharedPreferenceChangeListener() {

   @Override
   //コールバックメソッド
   public void onSharedPreferenceChanged(
     SharedPreferences sharedPreferences, String key) {
    // TODO Auto-generated method stub
    Log.d(TAG, "value is changed");
    //全てのPreferenceに実行する
    findPreference(key).setSummary(
      sharedPreferences.getString(key, ""));
    //特定のキーの場合のみ、実行する
    if(key.equals(SEARCHBOOKS_KEY)) 
    searchbooksPref.setSummary(
      searchbooksMap.get(sharedPreferences.getString(key, ""))); }    
   }
  };
 }

 @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  super.onPause();
  //登録
  getPreferenceScreen().getSharedPreferences()
    .unregisterOnSharedPreferenceChangeListener(listener);
 }

 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  super.onResume();
  //消去
  getPreferenceScreen().getSharedPreferences()
    .registerOnSharedPreferenceChangeListener(listener);
 }  

0 件のコメント:

コメントを投稿