给RelativeLayout设置onClickListener后点击无响应如何解决?
问题根因
你布局内的RecyclerView占了RelativeLayout绝大多数可交互区域,作为可滚动的交互控件,RecyclerView默认会消费触摸事件,不会将事件向上传递给父布局,因此你点击RecyclerView覆盖的区域时,父布局设置的点击事件不会被触发。
解决方案
- 方案一:无需保留RecyclerView交互能力的场景,直接禁用RecyclerView的点击、焦点属性即可,修改XML中RecyclerView的属性:
<androidx.recyclerview.widget.RecyclerView android:id="@+id/reviews" android:paddingTop="20dp" android:layout_width="match_parent" android:layout_height="400dp" android:clickable="false" android:focusable="false"/>
- 方案二:需要保留RecyclerView滚动能力的场景,给RecyclerView也绑定相同的点击监听即可:
binding.apply { val onRootClick = { NavigateWithItemName(itemname) Log.i("click","click") } reviewsRoot.setOnClickListener(onRootClick) reviews.setOnClickListener(onRootClick) }
- 方案三:希望父布局优先响应所有点击事件的场景,给父RelativeLayout添加
descendantFocusability属性,让父布局优先获取焦点:
<RelativeLayout android:id="@+id/reviews_root" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/border" android:clickable="true" android:descendantFocusability="beforeDescendants">
额外排查点
如果以上方案都无效,可检查View Binding初始化逻辑是否正确,是否使用了正确绑定实例设置监听,是否有其他上层控件消费了点击事件。
内容的提问来源于stack exchange,提问作者sooyeon
相关产品推荐
相关产品推荐

