如何在单击后退按钮时仅关闭活动对话框,而不关闭其后面的对话框?

How to, on clicking back button, dismiss only the active dialog, not the dialog behind it?

您好,我一直致力于通过单击已打开的对话框上的按钮来创建对话框。
第一个对话框的名称 = dialog_main
第二个对话框的名称 = dialog_edit
首先,我打开 dialog_main。它上面有一个按钮,按下它会打开 dialog_edit。
当我在 dialog_edit 外部单击时,它 return 返回到 dialog_main,这是它应该做的。
但是,当我单击后退按钮时,它会将对话框和 return 都关闭到主 activity。

我只想让 dialog_edit 的后退按钮事件 return 到 dialog_main。请看代码。

    final Dialog dialog_main = new Dialog(ViewTask.this);
            dialog_main.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog_main.setContentView(R.layout.dialog_main);
            dialog_main.setCanceledOnTouchOutside(true);
            dialog_main.setCancelable(true);
            dialog_main.show();

      //button is a button displayed on dialog_main
      button_edit_details.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    final Dialog dialog_edit = new Dialog(ViewTask.this);
                    dialog_edit.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    dialog_edit.setContentView(R.layout.dialog_edit_details);
                    dialog_edit.setCancelable(true);
                    dialog_edit.setCanceledOnTouchOutside(true);
                    dialog_edit.show();

                    dialog_edit.setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialogInterface) {
                     //do the operations
                     dialog_edit.dismiss();
                    });


                    dialog_edit.setOnKeyListener(new Dialog.OnKeyListener() {
                    @Override
                    public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) {

                        if (keyCode == KeyEvent.KEYCODE_BACK) {
                            //do same operations
                            dialog_edit.dismiss();                  
                });


            }
            }); //end of button onclicklistener


    dialog_main.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog_main) {
                //Data is displayed from operations in dialog_edit
                dialog_main.dismiss();
            }
        });

        dialog_main.setOnKeyListener(new Dialog.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog_main, int keyCode2, KeyEvent event2) {
                if (keyCode2 == KeyEvent.KEYCODE_BACK) {
                    //Data is displayed from operations in dialog_edit
                    dialog_main.dismiss();
                }
                return true;
            }
        });

}



代码中可能有一些错误,但我希望你能理解我在做什么。我尝试了一些在其他地方放置 "dialog_main.dissmiss()" 的组合,但问题仍然存在。

我还没有测试过,但我想这会解决你的问题..! 替换以下代码..!

    dialog_main.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog_main.setContentView(R.layout.dialog_main);
        dialog_main.setCanceledOnTouchOutside(false);
        dialog_main.setCancelable(false);
        dialog_main.show();

我能想到的一个解决方案是在适当的地方切换主对话框的可取消属性。

final Dialog dialog_main = new Dialog(ViewTask.this);
            dialog_main.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog_main.setContentView(R.layout.dialog_main);
            dialog_main.setCanceledOnTouchOutside(true);
            dialog_main.setCancelable(true);
            dialog_main.show();

  //button is a button displayed on dialog_main
  button_edit_details.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final Dialog dialog_edit = new Dialog(ViewTask.this);
                dialog_edit.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog_edit.setContentView(R.layout.dialog_edit_details);
                dialog_edit.setCancelable(true);
                dialog_edit.setCanceledOnTouchOutside(true);


                //mark main dialog as non-cancelable here
                dialog_main.setCancelable(false);
                dialog_edit.show();

                dialog_edit.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialogInterface) {
                 //do the operations
                 dialog_edit.dismiss();
                });


                dialog_edit.setOnKeyListener(new Dialog.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) {

                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                        //do same operations
                        dialog_edit.dismiss();


                        //mark main dialog as cancelable again
                        dialog_main.setCancelable(true);                  
            });


        }
        }); //end of button onclicklistener


dialog_main.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog_main) {
            //Data is displayed from operations in dialog_edit
            dialog_main.dismiss();
        }
    });

    dialog_main.setOnKeyListener(new Dialog.OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog_main, int keyCode2, KeyEvent event2) {
            if (keyCode2 == KeyEvent.KEYCODE_BACK) {
                //Data is displayed from operations in dialog_edit
                dialog_main.dismiss();
            }
            return true;
        }
    });

}