设置值

时间:2015-11-09 21:18:23

标签: android sharedpreferences preferencefragment

我有一个包含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),它们不会立即在屏幕上更新。

我错过了什么吗? 谢谢你的帮助。

0 个答案:

没有答案