2010年8月4日水曜日

Android Preference の summary を動的に変更

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

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

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




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

PreferenceActivity で


Preference searchbooksPref;

final static String SEARCHBOOKS_KEY = "searchbooks";

Map<String, String> searchbooksMap = new HashMap<String, String>();

@Override void onCreate() {
// 省略
String[] searchbooksKeys = getResources().getStringArray(R.array.search_books);
String[] searchbooksValues = getResources().getStringArray(R.array.search_books_value);

for(int i = 0; i < searchbooksKeys.length; i++)
searchbooksMap.put(searchbooksValues[i], searchbooksKeys[i]);

searchbooksPref = findPreference(SEARCHBOOKS_KEY);

// 省略
}


@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
}

@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
}

// ここで summary を動的に変更
private SharedPreferences.OnSharedPreferenceChangeListener listener =
new SharedPreferences.OnSharedPreferenceChangeListener() {

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

if(key.equals(SEARCHBOOKS_KEY))
searchbooksPref.setSummary(searchbooksMap.get(sharedPreferences.getString(key, "Books")));
}
};


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

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

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

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

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


private SharedPreferences.OnSharedPreferenceChangeListener listener =
new SharedPreferences.OnSharedPreferenceChangeListener() {

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

findPreference(key).setSummary(sharedPreferences.getString(key, "00000000"));
}
};



 

0 件のコメント:

コメントを投稿