2

我有一个带有 PreferenceFragment 的设置活动,其中包含我的应用程序的设置。我希望将每个首选项的值作为摘要,以便用户可以看到每个首选项的值。在preferences.xml 我定义了3 个偏好。一个是服务器 IP,第二个是服务器端口,第三个是打开外部应用程序(条形码阅读器)以扫描包含此 IP 和端口的二维码的意图。在onActivityResult 中,我获取 QR 内容,对其进行解析,并将这些值设置为 defaultSharedPreferences,其键与在preferences.xml 中设置的键相同,如下所示:

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 后调用此方法时,屏幕上的值不会更新。但是当我点击返回并再次打开此活动时,我看到这些新值在摘要中正确更新。因此它们被正确存储,但在扫描我想要的 QR 后它们不会立即在屏幕上更新,方法是在onActivityResult()中调用initSummary(serverPref/portPref ) 。

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

4

0 回答 0