アプリの設定を含む PreferenceFragment を使用した設定アクティビティがあります。ユーザーが各設定の値を確認できるように、すべての設定の値を要約として表示したいと考えています。Preferences.xml で、3 つの設定を定義しました。1 つはサーバー IP 用、2 番目はサーバー ポート用、3 番目は外部アプリ (バーコード リーダー) を開いてこの IP とポートを含む QR コードをスキャンするインテントです。onActivityResultで QR コンテンツを取得し、それを解析して、これらの値を、preferences.xml で設定されているものと同じキーの下で defaultSharedPreferences に設定します。
String[] scannedValues = parseQRCode(qrContent);
String serverAddr = scannedValues[0];
String port = scannedValues[1];
sharedPreferences.edit()
.putString(Keys.KEY_PREF_SERVER, serverAddr)
.putString(Keys.KEY_PREF_PORT, port)
.commit();
initSummary(findPreference(Keys.KEY_PREF_SERVER));
initSummary(findPreference(Keys.KEY_PREF_PORT));
これで、次のように、すべての設定の概要をその値で更新するメソッドができました。
private void initSummary(Preference p) {
if (p instanceof PreferenceGroup) {
PreferenceGroup group = (PreferenceGroup) p;
for (int i = 0 ; i < group.getPreferenceCount() ; i++)
initSummary(group.getPreference(i));
}
else
updatePrefSummary(p);
}
private void updatePrefSummary(Preference p) {
if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
p.setSummary(editTextPref.getText()); //text still contains old value (or it is not updated on the view)
}
}
onCreate()メソッドでは、initSummary(getPreferenceScreen()) を呼び出して、すべての集計をその値 (この場合は EditTextPreferences のみ) で更新します。これはうまく機能します。しかし、スキャンした値を defaultSharedPreferences にコミットした後にこのメソッドを呼び出すと、値は画面上で更新されません。しかし、[戻る] をクリックしてこのアクティビティを再度開くと、それらの新しい値が集計で正しく更新されていることがわかります。したがって、それらは正しく保存されますが、onActivityResult()でinitSummary(serverPref/portPref)を呼び出して必要な QR をスキャンした直後に画面上で更新されません。
何か不足していますか?助けてくれてありがとう。