【问题标题】:How to trigger an event on Dialog dismiss Android?如何在 Dialog Dismiss Android 上触发事件?
【发布时间】:2014-03-20 11:32:32
【问题描述】:

我有一个扩展 Dialog 类的自定义对话框,我想绑定一个事件以在用户按下设备的 BACK 按钮时关闭对话框后执行一些代码。我怎样才能做到这一点?我发现有人说在使用 Dialogs 和其他 Window 小部件时应该使用 .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

【问题讨论】:

    标签: java android dialog


    【解决方案1】:

    由于您正在扩展 android Dialog 类,因此您可以在 Activity 中实现 Dismiss Listener,并在创建 Dialog 时设置它,然后在侦听器中根据用于关闭 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 做到这一点?
    • 很好的解释……干得好。 +1。
    • 太好了,这就是我需要的。正如我之前所说,我需要这些方法的不同实现,具体取决于实例化 MyCustomDialog 的活动,所以有没有办法实现这些方法(我的意思是 onBackPressed() 和 onTouchEvent)当我创建对话框而不是在类定义中时自己?
    • TouchEvent 可以为对话框本身实现没有问题,对于回压事件,您可以设置 dialog.setCancelable(false);这将防止后台取消对话框。
    • 查看我对 backpress 事件处理程序的编辑,希望这能解决您的问题。
    【解决方案2】:

    您需要在 Dialog 类中重写 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() 的方法?
    • 我认为@TheMohanAhuja 的回答最适合您的要求。所以继续使用对话框关闭侦听器。
    【解决方案3】:

    如果您想在用户单击/触摸对话框外部并关闭它或使用后退按钮关闭时触发事件,请使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2022-06-11
      • 2022-11-20
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多