美文网首页Android开发经验谈android成神之路Android开发
自定义Dialog点击弹框外的区域无法关闭问题

自定义Dialog点击弹框外的区域无法关闭问题

作者: Vivi成长吧 | 来源:发表于2016-08-10 13:49 被阅读3707次

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

就解决了嘛,结果呢,不!管!用!
好吧,既然出了问题,那就找找原因吧。
自定义Dialog的布局文件很简单,就是一个ListView,一个取消按钮,代码如下:
<pre>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/dialog_root"
android:orientation="vertical"
android:padding="10dp">

<TextView
    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"/>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/cancel"
    android:background="@drawable/listview_bg">

    <ListView
        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"/>
</LinearLayout>

</RelativeLayout>
</pre>
既然点击Dialog区域外无反应,那么就要看看,点击的部分是不是确实不属于Dialog呢?
首先,在AndroidStudio工具栏里找到Android Device Monitor(如下图里的小机器人图标),点击打开。

Android Device Monitor.png

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

dump view.png

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

dialog.png

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

找到问题的原因,解决办法就简单了,只需要在代码里找到Dialog的根布局,然后设置点击事件,关闭Dialog就可以啦。
<pre>
findViewById(R.id.dialog_root).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { dismiss(); }});
</pre>
四不四很简单来,希望可以帮助有需要的同学~~~

相关文章

网友评论

    本文标题:自定义Dialog点击弹框外的区域无法关闭问题

    本文链接:https://www.haomeiwen.com/subject/eazdsttx.html