设置android:clickable="false"无效,显示遮罩后仍可操作底层控件
问题分析与解决方案
你遇到的问题核心在于对clickable属性的理解搞反了——当你把shadowView的clickable设为false时,它会直接把触摸事件传递给下方的控件,这就是为什么Tabs和ViewPager还能被点击、滑动的原因。
要实现“遮挡后方所有控件交互”的需求,你需要让shadowView成为一个能拦截并消费触摸事件的屏障,具体调整如下:
1. 修正shadowView的核心属性
把shadowView的clickable、focusable、focusableInTouchMode全部设为true,这样它会优先捕获所有触摸事件,不会让事件穿透到下层控件:
<View android:id="@+id/shadowView" android:focusable="true" android:focusableInTouchMode="true" android:clickable="true" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#BFFFFFFF" android:visibility="gone" />
2. 确保布局层级正确
从你的XML结构来看,shadowView和包含Tabs、ViewPager的RelativeLayout是同级控件。要让shadowView覆盖在所有内容之上,需要保证它在XML中的位置晚于其他需要遮挡的控件(XML中后声明的控件会绘制在更上层)。如果你的父布局是LinearLayout或FrameLayout,都要把shadowView放在末尾,确保它的层级最高。
3. 可选:处理点击反馈(可选)
如果不想让点击shadowView有任何视觉反馈,可以给它设置一个空的点击监听器:
shadowView.setOnClickListener(v -> { // 空实现,仅消费点击事件 });
为什么原来的设置无效?
clickable="false":表示该View不处理点击事件,触摸事件会继续向下传递给下层可交互控件;focusable="false":表示该View无法获取焦点,无法拦截焦点相关的事件;- 两者结合就导致
shadowView完全成为一个“透明”的屏障,根本起不到遮挡交互的作用。
调整后,当shadowView显示时,所有触摸、滑动事件都会被它拦截,下方的Tabs、ActionBar、ViewPager就无法响应任何操作了,完全符合你的需求。
内容的提问来源于stack exchange,提问作者MRu




