0

我想做的是询问用户何时要更改 EditTextPreference 并单击确定,如果某个条件为真,请询问他是否确定要更改设置。

因此,如果条件为真,我会显示一个对话框,询问他是或否,并且由于显示对话框是异步的,我在 OnPreferenceChange 回调中返回 false 以取消首选项更改。

如果用户决定不更改首选项,我什么也不做。但如果单击“是”,我将使用编辑器手动更改首选项并提交更改。

现在,在用户按下是(他想更改首选项)之后,如果他再次单击“首选项”屏幕中的 EditTextPreference,他将在 EditText 中设置旧值而不是新值。

只有当他关闭 Preferences 屏幕并再次打开它时,他才会看到新值。

所以我的问题是,在 editor.commit() 之后,我是否可以在“是”Dialog.OnClickListener() 中调用任何方法,这将使 Preferences 屏幕使用 SharedPreferences 中的新值更新其视图?

还是有其他方法可以实现我想要的?

谢谢

代码示例:

EditTextPreference etp;
etp.setOnPreferenceChangeListener(new OnPreferenceChangeListener()
    {           
        @Override
        public boolean onPreferenceChange(final Preference preference, final Object newValue)
        {
            int a;
            int b;

            if(a < b) {
                AlertDialog.Builder builder = new AlertDialog.Builder(Preferences.this);
                Dialog changeMaxCountConfirmationDialog = builder
                        .setCancelable(true)
                        .setTitle("Change Setting")
                        .setMessage("Are you sure you want to change this setting")
                        .setPositiveButton("Yes", new Dialog.OnClickListener()
                        {
                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                //Because I return false anyway, I change the preference manually here
                                Editor editor = preference.getEditor();
                                editor.putString("key", newValue.toString());
                                editor.commit();
                            }
                        }).setNegativeButton("No", null)
                        .create();
                changeMaxCountConfirmationDialog.show();
                return false;
            }

            return true;
        }
    });
4

2 回答 2

1

我找到了一个两部分的解决方案。第 1 部分涉及向OnSharedPreferenceChangeListener您的 PreferenceScreen 添加一个。

第1部分

public class BaseSettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        ...
    }


    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(YOUR_KEY)) {
            updateUI();
        }
    }
}

通过此设置,您现在可以收听Preference对象上的首选项更改,而不是通过SharedPreferences.

第2部分

OnPreferenceChangeListener您可以在对象内部显示对话框Preference(正如 OP 已经完成的那样)。如果用户确认他们的选择,您可以使用首选项的setValue功能来设置新值,从而导致SharedPreferences被更新和onSharedPreferenceChanged被调用。如第 1 部分所述,onSharedPreferenceChanged可以包含任何 UI 更新逻辑(例如更新首选项的摘要)。

public class BaseSettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

        //Part 2
        final ListPreference listPreference = (ListPreference) findPreference(YOUR_KEY));
        listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(final Preference preference, final Object newValue) {
                new AlertDialog.Builder(c)
                        .setTitle("Are you sure?")
                        .setMessage("Are you sure you want to change this preference?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ((ListPreference)preference).setValue((String) newValue);
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        })
                        .show();
                return false;
            }
        });
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(YOUR_KEY)) {
            updateUI();
        }
    }
}
于 2017-09-06T13:22:36.260 回答
0

我知道这是一个迟到的答案,但可能对其他人有帮助。

而不是使用Editor简单的 use EditTextPreference#setText()

即替换你的代码

//Because I return false anyway, I change the preference manually here
Editor editor = preference.getEditor();
editor.putString("key", newValue.toString());
editor.commit();

像这样:

//Because I return false anyway, I change the preference manually here
((EditTextPreference)preference).setText(newValue.toString());
于 2012-12-25T11:30:02.943 回答