android点dialog工具栏,自定义Dialog点击弹框外的区域无法关闭问题

本文介绍了在Android开发中遇到自定义Dialog点击弹框外区域无法关闭的问题,通过分析布局层级发现灰色透明区域仍属于Dialog。解决方法是在Dialog的根布局上设置点击事件,监听关闭Dialog。分享了解决此问题的步骤和代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在实现一个自定义Dialog时,产品要求点击弹框外的区域要能够关闭Dialog,本来以为很简单的,只需一行代码

setCanceledOnTouchOutside(true);

就解决了嘛,结果呢,不!管!用!

好吧,既然出了问题,那就找找原因吧。

自定义Dialog的布局文件很简单,就是一个ListView,一个取消按钮,代码如下:

 
 

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/dialog_root"

android:orientation="vertical"

android:padding="10dp">

android:id="@+id/cancel"

android:layout_width="match_parent"

android:layout_height="54dp"

android:layout_alignParentBottom="true"

android:layout_marginBottom="10dp"

android:layout_marginTop="8dp"

android:background="@drawable/cancel_selector"

android:gravity="center"

android:text="@string/cancel"

android:textColor="@color/btn_bg"

android:textSize="18dp"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_above="@+id/cancel"

android:background="@drawable/listview_bg">

android:id="@+id/dialog_listview"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:cacheColorHint="@color/transparent"

android:divider="@color/live_disable"

android:dividerHeight="1px"

android:fadingEdge="none"

android:listSelector="@drawable/transparent"

android:scrollbars="none"/>

既然点击Dialog区域外无反应,那么就要看看,点击的部分是不是确实不属于Dialog呢?

首先,在AndroidStudio工具栏里找到Android Device Monitor(如下图里的小机器人图标),点击打开。

9b6f192100ad

Android Device Monitor.png

然后,选中自己的程序进程,点击Dump View按钮(如下图所示icon)

9b6f192100ad

dump view.png

这时候在右侧就能看到Dialog的布局层级视图,我出现问题的dialog布局视图如下:

9b6f192100ad

dialog.png

可以看到,红色框框就是Dialog的根布局,也就是说灰色透明区域仍然属于Dialog本身。而setCanceledOnTouchOutside(true)这个方法是指点击Dialog之外的屏幕区域才有效,问题就出在这儿了。

找到问题的原因,解决办法就简单了,只需要在代码里找到Dialog的根布局,然后设置点击事件,关闭Dialog就可以啦。

 
 

findViewById(R.id.dialog_root).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { dismiss(); }});

四不四很简单来,希望可以帮助有需要的同学~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值