Android监听Dialog点击外部区域

  • 监听外部区域点击事件的抽象父类Dialog
public abstract class OutsideClickDialog extends Dialog {
    public OutsideClickDialog(@NonNull Context context) {
        super(context);
    }

    public OutsideClickDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

    protected OutsideClickDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    protected abstract void onTouchOutside();


    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {
        //点击弹窗外部区域
        if (isOutOfBounds(getContext(), event)) {
            onTouchOutside();
        }
        return super.onTouchEvent(event);
    }

    private boolean isOutOfBounds(Context context, MotionEvent event) {
        final int x = (int) event.getX();//相对弹窗左上角的x坐标
        final int y = (int) event.getY();//相对弹窗左上角的y坐标
        final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();//最小识别距离
        final View decorView = getWindow().getDecorView();//弹窗的根View
        return (x < -slop) || (y < -slop) || (x > (decorView.getWidth() + slop))
                || (y > (decorView.getHeight() + slop));
    }

}
Android中,我们通常可以使用Dialog类来创建对话框。当我们创建一个对话框时,默认情况下,点击对话框的外部区域是不会关闭对话框的。但是,有时候我们可能需要在点击外部区域时关闭对话框。要实现这个功能,我们可以通过设置对话框的属性来实现。 一种常见的方法是使用Dialog类的setCanceledOnTouchOutside(boolean)方法。当我们想要点击外部区域时关闭对话框时,我们可以调用该方法并将参数值设置为true。例如,如果我们有一个名为dialog的对话框对象,我们可以使用以下代码来实现: dialog.setCanceledOnTouchOutside(true); 这样,当我们点击对话框外部区域时,对话框将会自动关闭。 另一种方法是使用Dialog类的setOnCancelListener(OnCancelListener)方法。我们可以通过实现OnCancelListener接口并重写onCancel()方法来监听对话框的取消事件。例如,我们可以创建一个名为cancelListener的OnCancelListener对象,然后将其设置给对话框,如下所示: dialog.setOnCancelListener(cancelListener); 在cancelListener的onCancel()方法中,我们可以添加我们想要执行的关闭对话框的代码,例如: @Override public void onCancel(DialogInterface dialog) { dialog.dismiss(); } 当我们点击对话框的外部区域时,onCancel()方法将会被调用,从而实现关闭对话框的功能。 无论是使用setCanceledOnTouchOutside()方法还是setOnCancelListener()方法,都能够实现对话框点击外部区域事件的处理。根据具体的需求,我们可以选择其中一种方法来实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值