我有一个扩展对话框类的自定义对话框,我想绑定一个事件,以便在用户按下设备的“后退”按钮时关闭对话框后执行一些代码。我怎样才能做到这一点?我发现一篇文章,有人说在使用对话框和其他窗口小部件时应该使用 .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 类一起使用?
由于您正在扩展 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;
}
});
快乐编码!!!
您需要重写 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
}
}
如果您想在用户单击/触摸对话框外部并关闭它或使用后退按钮关闭时触发事件,请使用
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();
}
});
我在Kotlin(Java类似)中采用的方法是将以下代码耦合到创建的所有对话框中。
val dial = Dialog(.....)
...
dial.setOnCancelListener {
// your code
}
dial.show()
其中
dial
指向在您的系统上创建的每个对话框。
在
you code
中,你可以放置垃圾收集和任何你想要的代码。