如何在Android对话框关闭时触发事件?

3
我有一个自定义对话框,它扩展了Dialog类,我想绑定一个事件,在用户按下设备的BACK按钮关闭对话框后执行一些代码。我该怎么做?我找到了一个帖子,其中有人说在处理对话框和其他窗口小部件时应使用.addWindowListener()方法。但是对话框类没有addWindowListener方法,因此我无法使用它。除了使用片段之外,是否还有其他方法,因为我不应重新编写MyCustomDialog类?这是代码:
public class MyCustomDialog extends Dialog {

public MyCustomDialog(Context context, int layoutResourceId) {
    super(context);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(layoutResourceId);

}
}  

感谢关注!
编辑:我在Android开发者网站上找到了这个,有办法与MyCustomDialog类一起使用吗? onDismiss DialogInterface
3个回答

3

由于您正在扩展Android Dialog类,因此可以在Activity中实现Dismiss Listener并在创建Dialog时设置它,然后在侦听器中根据用于关闭对话框的按钮实现任何所需功能。

希望这能解决您的问题。

编辑 您可以使用dialog.setCanceledOnTouchOutside(false);来阻止在触摸对话框之外时关闭对话框。

类似于这样,

  Dialog dialog = new Dialog(context)
  dialog.setCanceledOnTouchOutside(false);

或者

重写对话框的onTouchEvent()方法并检查操作类型。如果操作类型为'MotionEvent.ACTION_OUTSIDE',则表示用户正在对话框区域外进行交互。因此,在这种情况下,您可以关闭对话框或决定执行您想要的操作。

dialog.setOnTouchListener(new View.OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event)  
    {  

       if(event.getAction() == MotionEvent.ACTION_OUTSIDE){  
            Toast.make(getApplicationContext(), "TOuched outside the dialog", Toast.LENGTH_LONG).show();  
               this.dismiss();  
       }  
       return false;  
    }
});  

对于返回键,你可以使用dialog.setCancelable(false);来防止对话框被返回事件取消。

或者你也可以覆盖setOnKeyListener事件并在其中放入自己的代码。

编辑

dialog.setOnKeyListener(new Dialog.OnKeyListener() {

        @Override
        public boolean onKey(DialogInterface arg0, int keyCode,
                KeyEvent event) {
            // TODO Auto-generated method stub
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
                dialog.dismiss();
            }
            return true;
        }
    });

快乐编程!!!


谢谢,但即使对话框显示并且用户在其外部点击,对话框也会被关闭,因此用户单击空白屏幕,所以我也需要捕获该事件。我还想触发该事件。是否可以使用Dismiss Listener来实现? - tonix
太好了,这正是我所需要的。就像我之前说的那样,根据实例化MyCustomDialog的活动不同,我需要这些方法的不同实现,那么在创建对话框时有没有一种方式来实现这些方法(我的意思是onBackPressed()和onTouchEvent),而不是在类定义中定义它们本身? - tonix
请查看我的编辑,针对后退事件处理程序,我希望这可以解决你的问题。 - TheMohanAhuja
能够很好地与“后退”按钮配合使用,我该如何添加一个侦听器来监听MotionEvent.ACTION_OUTSIDE事件,并在用户点击对话框之外时执行一些功能? - tonix
请看我的编辑,它会告诉你如何正确使用触摸监听器。 - TheMohanAhuja
显示剩余4条评论

1

您需要在对话框类中覆盖onBackPressed。在覆盖OnBackPressed后,确保关闭对话框。

试试这个:

public class MyCustomDialog extends Dialog {

public MyCustomDialog(Context context, int layoutResourceId) {
    super(context);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(layoutResourceId);

}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();

     dismiss();   // make sure to call dismiss to close dialog

    // put your code here
}
}

谢谢,但是onBackPressed()方法应该是一个回调匿名方法,我在活动中调用它,因为事件监听器应该根据创建对话框的活动以不同的方式进行操作,并且当对话框被解除时我应该做什么。是否有类似于addWindowListener()的方法? - tonix
我认为@TheMohanAhuja的回答最符合您的要求。所以请使用Dismiss Listener with Dialog。 - Chirag Ghori

0
如果你想在用户点击/触摸对话框之外并关闭它或使用后退按钮关闭时触发事件,则使用以下代码:
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                //your trigger goes here
                Toast.makeText(IntroductoryActivity.this, "on cancel", Toast.LENGTH_SHORT).show();
            }
        });

但是如果你想在对话框关闭时触发某些事件,比如其他事件,那么可以使用

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                //your trigger goes here
                Toast.makeText(IntroductoryActivity.this, "on dismiss", Toast.LENGTH_SHORT).show();
            }
        }); 

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