0

我想请用户确认我的应用程序设置中 CheckBoxPreference 的更改。我尝试在 OnPreferenceClickListener 和 OnSharedPreferenceChangeListener 中都放置一个 AlertDialog,但是单击首选项后,我没有成功取消 CheckBoxPreference 更改。谢谢你的帮助。


内森,我尝试了以下两个想法:

1)像这样在 PreferenceActivity 中实现 OnPreferenceClickListener :

    @Override
public boolean onPreferenceClick(Preference preference) { 
        new AlertDialog.Builder(this)
        .setTitle("Move Data to SD card")
        .setMessage("This will ...... Are you sure?")
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {    
            }
        })
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {   
                CheckBoxPreference checkBoxPref  = (CheckBoxPreference)findPreference(getString(R.string.prefSDEpisodes_key));
                checkBoxPref.setChecked(!checkBoxPref.isChecked() );
            }
        })
        .show();
    return false;
}

实际上它有效,但我对这个解决方案不满意,因为用户看到 CheckBoxPrefence 的状态在对话框后面的背景中发生变化。这只是一种解决方法,包括换回盒子。这根本不干净。我需要在更改之前获得控制权。

2) 在 PreferenceActivity 中使用 onSharedPreferenceChanged() 中的类似代码实现 OnSharedPreferenceChangeListener,但在这种情况下,setNegativeButton() 中的框值的交换会以编程方式一次又一次地触发首选项更改事件。摆脱确认对话框的唯一方法是选择“是”。

如果没有简单的解决方案,我已准备好扩展 CheckBoxPrefence 但如何?我应该覆盖哪种方法?

4

1 回答 1

0

我设法做到了(顺便说一句,我的代码仅在未选中复选框时才显示确认对话框,因此我必须更改它)

        final CheckBoxPreference myPref = (CheckBoxPreference) findPreference("myPref");
        if (myPref != null) {
            myPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    if (newValue instanceof Boolean && ((Boolean) newValue) != PreferencesHelper.getMyPref()) {
                        final boolean isEnabled = (Boolean) newValue;
                        if (!isEnabled) {

                            new AlertDialog.Builder(PreferencesActivity.this)
                            .setTitle("Confirm")
                            .setIcon(R.drawable.alert)
                            .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    // do nothing
                                }
                            })
                            .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    // OK has been pressed => force the new value and update the checkbox display
                                    PreferencesHelper.setMyPref(false);
                                    myPref.setChecked(false);
                                }
                            }).create().show();

                            // by default ignore the pref change, which can only be validated when OK is pressed
                            return false;

                        }
                    } 
                    return true;
                }
            });
        }

=> PreferencesHelper 代码

public static boolean getMyPref() {
    return getSharedPreferences().getBoolean("myPref", true);
}

public static void setMyPref(boolean newValue) {
    Editor edit = getEditor();
    edit.putBoolean("myPref", newValue);
    edit.apply();   
}
于 2015-03-18T08:41:03.547 回答