在取消对话框中恢复切换按钮的状态

时间:2017-04-06 08:21:11

标签: android android-togglebutton switchcompat

我的活动中有一个切换按钮。当开关打开时,它显示启用对话框并且开关关闭,它显示禁用对话框。

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

在两个对话框中,切换按钮切换状态,即切换处于ON状态,然后按下按钮,弹出对话框,当我按CANCEL时,它从ON变为OFF状态。预期的结果是当按下CANCEL时,切换按钮应保持在其原始位置,即,如果切换为ON,则在按下CANCEL时它应保持为ON。我将如何实现这种操作?

另外,如果我执行类似下面的操作,则按下CANCEL时会同时弹出对话框。

if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false);
}else {
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true);
}

2 个答案:

答案 0 :(得分:2)

你必须知道:

  • 在SwichCompat状态发生变化后调用onCheckedChanged。
  • 如果您向SwitchCompat添加了OnCheckedChangeListener,则在更改swich状态(通过代码或手动按下)后将触发此侦听器

所以,快速解决这个问题,在你将swich set的检查状态设置为onCheckedChanged然后再次放入监听器之前。这是一个例子:

 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);

答案 1 :(得分:0)

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

上面的其他每个代码都表示取消操作属于你的“其他” - 你可以添加

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

((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true);
--- todo --- / comment下面的

就在你对话之前的对话框(。);