取消对话框时恢复切换按钮的状态。

3
我有一个切换按钮在我的活动中。当开关打开时,显示启用对话框,开关关闭时,显示禁用对话框。
((SwitchCompat) findViewById(R.id.toggleButton)).setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
                ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("on");
                showEnableSharingDialog();
            } else {
                ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("off");
                showDiasableShareingDialog();
            }
        }
    });

这是启用对话框:

private void showEnableShareingDialog() {
    final CharSequence options[]= getResources().getStringArray(R.array.sharing_options);
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this);

     builder.setTitle(getString(R.string.you_want_to_enable_prev_sigtings));

    builder.setItems(options, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if(which==0){
                mShareSigtings=true;
                mEnableShareing=true;
                updateSettings();
            } else if(which==1){
                mShareSigtings=true;
                mEnableShareing=false;
                updateSettings();
            } else {
                /*---todo---*/
                dialog.cancel();
            }
        }
    });
    builder.show();
}

这是禁用对话框:
private void showDiasableShareingDialog() {
    final CharSequence options[]= getResources().getStringArray(R.array.remove_sharing_options);
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this);

    builder.setTitle(getString(R.string.you_want_to_remove_prev_sigtings));

    builder.setItems(options, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (which == 0) {
                mShareSigtings = false;
                mRemovePrevSigtings = true;
                updateSettings();
            } else if (which == 1) {
                mShareSigtings = false;
                mRemovePrevSigtings = false;
                updateSettings();
            } else {
                /*---todo---*/
                dialog.cancel();
            }
        }
    });
    builder.show();
}

在两个对话框中,切换按钮会切换其状态,例如,如果切换处于“打开”状态,我按下按钮,对话框弹出,当我按下“取消”时,它会从“打开”变为“关闭”状态。期望的结果是按下“取消”后,切换按钮应该保持在原来的位置,即如果切换是打开的,则按下“取消”后它应该仍然是打开的。我应该如何实现这种操作呢?
另外,如果我像下面这样做,两个对话框将会在连续按下“取消”时不断地弹出。
if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false);
}else {
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true);
}

你的 setOnChangeListener 的条件在你设置开关切换时引起了问题。当通过 .setChecked 编程切换开关时调用,它就会被触发。 - Jojo Narte
2个回答

3

您需要知道:

  • onCheckedChanged在SwichCompat状态更改后被调用。
  • 如果您向SwitchCompat添加了OnCheckedChangeListener,那么该侦听器将在任何时候更改开关的状态(通过代码或手动按下)后触发。

因此,在更改开关的检查状态之前,快速修复方法是将onCheckedChanged设置为null,然后再次放置侦听器。以下是示例:

 SwitchCompat mySwich = ((SwitchCompat) findViewById(R.id.toggleButton))   
     OnCheckedChangeListener listener = new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(isChecked){
                        ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("on");
                        showEnableSharingDialog();
                    } else {
                        ((StyleableTextView) findViewById(R.id.lbl_toggle_status)).setText("off");
                        showDiasableShareingDialog();
                    }
                }
            };
mySwitch.setOnCheckedChangeListener(listener);

在您的CANCEL回调函数中,您可以像这样执行操作:
mySwitch.setOnCheckedChangeListener(null);
if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false);
}else {
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true);
}
mySwitch.setOnCheckedChangeListener(listener);

感谢您的帮助,这样做解决了我的问题。 - Raj

0

else {
   /*---todo---*/
   dialog.cancel();
}

在上面的每个else代码中,表示取消操作的代码都会落在“else”上 - 对于您的情况,您可以添加


((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false);

或者

((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true);

在 /---待办事项---/ 注释下方,就在 dialog.cancel(); 之前。


我需要为两个对话框都添加它吗,还是只需添加其中一个? - Raj
@Raj 试一下一个或两个。 - Jojo Narte
我按照你说的尝试了,结果发现它在某个条件下失败,具体取决于放置的位置,而且对话框会显示两次。 - Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接