我有一个包含PreferenceFragment的设置活动,其中包含我的应用的设置。我希望将每个首选项的值作为摘要,以便用户可以看到每个首选项的值。 在preferences.xml中我定义了3个首选项。一个用于服务器IP,第二个用于服务器端口,第三个用于打开外部应用程序(条形码阅读器)以扫描包含此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后调用此方法时,屏幕上的值不会更新。但是当我点击Back并再次打开此活动时,我会在摘要中看到这些新值正确更新。所以它们存储正确,但是在扫描了我想要的QR之后,通过在 onActivityResult()中调用 initSummary(serverPref / portPref),它们不会立即在屏幕上更新。
我错过了什么吗? 谢谢你的帮助。