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

Restore state of toggle button on canceling dialog

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

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

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

此外,如果我执行类似下面的操作,则在按下“取消”时两个对话框都会不断弹出。

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

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

在上面的每个其他代码中表示针对您的情况 "else" 的取消操作 - 您可以添加

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

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

在 /---todo---/ 评论下方,就在你 dialog.cancel();

之前

你必须知道:

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

因此,一个快速修复方法是,在您更改开关的检查状态之前将 null 设置为 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);

在您的取消回调中,您可以执行类似的操作:

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