如何在Android Dialog Dismiss上触发事件?

问题描述 投票:0回答:4

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

关闭对话框界面

java android dialog
4个回答
3
投票

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

希望这能解决您的问题。

编辑 您可以使用

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

快乐编码!!!


1
投票

您需要重写 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
}
}

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

0
投票

我在KotlinJava类似)中采用的方法是将以下代码耦合到创建的所有对话框中。

val dial = Dialog(.....)
...
dial.setOnCancelListener {
 // your code 
}
dial.show()

其中

dial
指向在您的系统上创建的每个对话框。

you code
中,你可以放置垃圾收集和任何你想要的代码。

© www.soinside.com 2019 - 2024. All rights reserved.