2

我有一个DialogPreference名为的子类MyDialogPreference,它有两个用于用户名和密码的 EditText,当我单击DialogInterface.BUTTON_POSITIVE按钮时,我设置了一些首选项,如下所示:

//I get userId from SQLite before this
SharedPreferences settings = this.getContext()
                .getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();

editor.putInt("userId", userId);
editor.commit();

我希望在调用 DialogPreference 的 SettingsFragment 中,每当我关闭 MyDialogPreference 时,我都可以将更改的数据显示为 Preference 的摘要

这是首选项的布局:

    <Preference
        android:key="update"
        android:title="Update other preference" >
    </Preference>

    <com.cmr.MyDialogPreference
        android:key="userPassScreen"
        android:title="Login User" >
    </com.cmr.MyDialogPreference>

我试图将此 DialogPreference 绑定到 OnPreferenceChangeListener,但它没有用。

这也是它的代码:

DialogPreference userPassScreen = (DialogPreference) findPreference("userPassScreen");
userPassScreen
            .setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference,
                        Object newValue) {
                    SharedPreferences settings = context
                            .getSharedPreferences(PREFS_NAME, 0);

                    int userId = settings.getInt("userId", 0);
                    if (userId == 0) {
                        preference.setSummary("Please Login");
                        return false;
                    }
                    try {
                        preference.setSummary(String.valueOf(userId));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return false;
                }
            });

有什么办法可以做到吗?

PS。对不起,我的英语不好

4

1 回答 1

4

DialogPreference 的 Android 文档不完整!

看看 Preference#onClick() 的 JavaDoc

/**
 * Processes a click on the preference. This includes saving the value to
 * the {@link SharedPreferences}. However, the overridden method should
 * call {@link #callChangeListener(Object)} to make sure the client wants to
 * update the preference's state with the new value.
 */
protected void onClick() {
}

“被覆盖的方法应该调用 {@link #callChangeListener(Object)}”

在 DialogPreference 中,onClick 被覆盖以打开对话框,但 onDialogClosed() 的 JavaDoc 没有提到调用 #callChangeListener(Object)。

所以只需添加一个

callChangeListener(newValue);

调用 onDialogClosed() 实现的开头。

但是,这应该在 DialogPreference 本身中实现。

于 2013-11-05T15:13:17.387 回答