Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在取消对话框上恢复切换按钮的状态_Android_Android Togglebutton_Switchcompat - Fatal编程技术网

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

Android 在取消对话框上恢复切换按钮的状态,android,android-togglebutton,switchcompat,Android,Android Togglebutton,Switchcompat,我的活动中有一个切换按钮。开关打开时,显示启用对话框;开关关闭时,显示禁用对话框 ((SwitchCompat) findViewById(R.id.toggleButton)).setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

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

((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();
}
这是“禁用”对话框:

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时两个对话框会持续弹出

if(((SwitchCompat)findViewById(R.id.toggle3)).isChecked()){
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(false);
}else {
                    ((SwitchCompat)findViewById(R.id.toggle3)).setChecked(true);
}
else{
/*---待办事项---*/
dialog.cancel();
}
您必须知道:

  • onCheckedChanged在SwichCompat的状态更改后调用
  • 如果将OnCheckedChangeListener添加到SwitchCompat,则在开关状态发生任何更改后(通过代码或手动按下)将触发此侦听器
因此,在将swich set 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);

设置开关切换时,setOnChangeListener的条件导致了问题。当调用用于通过.setChecked以编程方式切换开关的代码时,它会被触发。我必须为两个对话框或其中任何一个添加它吗?@Raj尝试一个或两个。我按照你说的那样尝试过,结果它在一种情况下失败了,这取决于你把它放在哪里。对话框显示了两次。谢谢你的帮助,这样做解决了我的问题