Android上层ImageView点击事件被底层拦截的解决方法咨询
解决上层ImageView点击触发底层ImageView事件的问题
核心原因
上层嵌套在CardView中的iv_user没有正确拦截点击事件,导致事件透传到了底层的iv_contact上。即使单独给ImageView设置android:clickable="true",如果其父容器(CardView)不具备消费事件的能力,点击事件依然会向下传递。
解决方案
可以通过以下两种方式解决:
方式一:给CardView和内部ImageView同时设置可点击属性
给外层CardView和内部iv_user都添加android:clickable="true"和android:focusable="true",确保父容器和子View都能拦截点击事件:
<androidx.cardview.widget.CardView android:id="@+id/cv_video_send" android:layout_width="@dimen/dp0" android:layout_height="@dimen/dp0" app:layout_constraintTop_toTopOf="parent" app:layout_constraintRight_toRightOf="parent" android:layout_marginTop="@dimen/dp12" android:layout_marginRight="@dimen/dp12" app:cardCornerRadius="@dimen/dp16" app:layout_constraintHeight_percent="0.25" app:layout_constraintWidth_percent="0.3" app:layout_constraintWidth_min="@dimen/dp110" app:layout_constraintHeight_min="@dimen/dp175" android:clickable="true" android:focusable="true"> <ImageView android:id="@+id/iv_user" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" /> </androidx.cardview.widget.CardView>
方式二:给ImageView添加点击反馈前景
给iv_user设置android:foreground="?attr/selectableItemBackground",这个属性不仅能让View响应点击,还会自带点击波纹效果,同时自动阻止事件向下传递:
<ImageView android:id="@+id/iv_user" android:layout_width="match_parent" android:layout_height="match_parent" android:foreground="?attr/selectableItemBackground" />
这种方式更简洁,推荐使用。
验证方法
修改布局后重新运行项目,点击上层iv_user区域,应该会触发对应的REQUEST_USER_IMAGE跳转,不会再触发底层iv_contact的事件。
内容的提问来源于stack exchange,提问作者user20630255
相关产品推荐
相关产品推荐

