EditTextPreferences,显示更改设置确认对话框和对用户选择的响应

时间:2012-06-14 07:24:21

标签: android android-preferences

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

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

如果用户决定不更改pref,我什么都不做。但如果单击是,我手动更改首选项和编辑器并提交更改。

现在用户按下是(他想更改pref),如果他再次单击Preferences屏幕中的EditTextPreference,他将在EditText中找到旧值而不是新值。

只有当他关闭“首选项”屏幕并再次打开它时,他才会看到新值。

所以我的问题是,是否有任何方法可以在editor.com发送后在“是”Dialog.OnClickListener()中调用,这将使“首选项”屏幕使用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;
        }
    });

2 个答案:

答案 0 :(得分:1)

我找到了两部分解决方案。第1部分涉及在PreferenceScreen中添加OnSharedPreferenceChangeListener

第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();
        }
    }
}

答案 1 :(得分:0)

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

而不是使用Editor,只需使用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());