事件分发机制:demo复现自定义ViewGroup点击事件不起作用

几年前遇到的一个bug,不弄清楚心里就是不舒服!

平时应用开发中,经常遇到的UI需求,例如抖音的设置界面,如下图所示:

很容易想到,自定义一个Layout,左边一个图标,中间文字说明,右侧一个箭头,底部一条分割线。点击整个条目,跳转到另外一个Activity。动手写的时候,就遇到bug了,item的点击事件不起作用。

看bug情况,如下图:

点击子View有效果,点击自定义的布局没有log。这是怎么回事?

看看代码:

public class RelativeActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_relative);}
}//activity布局:
<?xml version="1.0" encoding="utf-8"?>
<com.exp.clickdemo.rl_bug.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"></com.exp.clickdemo.rl_bug.MyRelativeLayout>

自定义的布局MyRelativeLayout:

public class MyRelativeLayout extends RelativeLayout {public MyRelativeLayout(Context context) {this(context,null);}public MyRelativeLayout(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}public MyRelativeLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);inflater.inflate(R.layout.my_relativelayout, this);setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.i("xx", "click MyRelativeLayout");}});ImageView iv = findViewById(R.id.iv);iv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.i("xx", "click ImageView");}});}
}

item布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="80dp"android:clickable="true"android:background="#00ff00"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:text="通用设置"android:textSize="28sp" /><ImageViewandroid:id="@+id/iv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:src="@drawable/icon_goto" /></RelativeLayout>

按道理讲,点击箭头左侧区域,应该有日志“click MyRelativeLayout" 才对。为什么没有了?

在设置点击事件的后面加一行代码:

Log.i("xx", "MyRelativeLayout is clickable:" + isClickable());

日志显示:I/xx: MyRelativeLayout is clickable:true,也就是说MyRelativeLayout可以点击,可以点击,又有点击事件,为啥就不起作用了?

继续尝试,把item布局中android:clickable="true"去掉,神奇的是,点击事件竟然起作用了,这里就不贴日志和效果了。不卖关子了,直接说原因:设置android:clickable="true"后,布局中的RelativeLayout消费了点击事件,但是这个RelativeLayout又没有onClickListener,所以没有日志。外层的MyRelativeLayout虽然可以点击,也设置了点击事件,但是点击事件已经被RelativeLayout消费了。把android:clickable="true"去掉后,RelativeLayout不可点击,消费事件回传给MyRelativeLayout,这样点击事件又起作用了。

为了验证上面的分析,我们把android:clickable="true"再加回去,在Activity的布局中,给MyRelativeLayout加上红色背景,再设置padding:

    android:padding="20dp"android:background="#ff0000"

点击看看效果:

可以看出MyRelativeLayout的点击事件是起作用的,只不过没有回传给它,就已经消费调了。而消费点击事件的RelativeLayout,又没有设置onClickListener,所以点击就没有日志。

代码已经上传到Gitee上,地址是:https://gitee.com/zhagnjinaaaa/click-demo,后面的博客,会继续跟踪代码,深挖原因!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无痕消除笔怎么用?3款工具教你完美消除

无痕消除笔怎么用&#xff1f;无痕消除笔在图片编辑中扮演着至关重要的角色。它利用先进的图像处理技术&#xff0c;让用户只需简单几步操作&#xff0c;就能轻松抹除图片上任何不想要的细节&#xff0c;无论是明显的瑕疵、多余的文字还是恼人的水印。这一功能不仅提高了编辑效…

华为大咖说 企业应用AI大模型的“道、法、术” -- 法:落地篇 (上)

本文作者&#xff1a;郑岩&#xff08;华为云AI变革首席专家&#xff09;全文约2865字&#xff0c;阅读约需7分钟 在探讨企业如何应用AI大模型的“道、法、术”系列文章的前两篇文章中&#xff0c;我们已经深化了对“AI大模型”的理解&#xff0c;并通过“AI场景12问”洞察了潜…

鸿蒙 HarmonyOS Next 路由 不废话 全干货

一、页面的创建 &#xff08;1&#xff09;直接通过创建一个新的Page的方式创建 &#xff08;2&#xff09;先创建一个 ArkTs File文件&#xff0c;然后在resources/base/profile/main_pages.json中加上页面对应的src路径&#xff0c;下面的Index_3.ets文件是通过创建ArkTs Fi…

【区分vue2和vue3下的element UI Breadcrumb 面包屑组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中&#xff0c;Element UI 提供了 el-breadcrumb 面包屑组件&#xff0c;而在 Vue 3 中&#xff0c;Element UI 的官方版本并没有直接更新以支持 Vue 3&#xff0c;但有一个类似的库叫做 Element Plus&#xff0c;它是为 Vue 3 设计的。 Vue 2 Element UI 在 Vue 2…

Linux安装达梦

文章目录 前言一、docker安装1.下载镜像2.导入镜像3.生成容器 二、ios安装1.环境准备2.iso安装3.配置实例4.注册服务5.启停服务 总结 前言 公司要求我将数据从oracle迁移到达梦数据库&#xff0c;这个国产数据库以前没用过&#xff0c;所以记录一下这次的安装过程。 一、docke…

【代码随想录算法训练营第五十八天|卡码网101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿】

文章目录 101.孤岛的总面积102.沉没孤岛103.水流问题正向逻辑反向逻辑 104.建造最大岛屿 101.孤岛的总面积 可以把最外围的都检查一遍是否有为1的&#xff0c;有的话就把他接壤的全变成海&#xff0c;然后正常算面积。也可以看岛屿是否有靠边的位置&#xff0c;有的话该岛面积…

后端部署Jar包 | 启动失败系列问题(图解-BuiId,Maven)

目录 项目的构建 打包前的准备 合理配置pox.xml文件 Build 打包方式 Maven打包方式 Jar包部署 测试后端接口 项目的构建 我的项目是SpringBoot2脚手架 先准备一个相对于的数据库依赖 数据库的任意库 Yaml配置后 才能正常在IDEA中跑起来 打包前的准备 合理配置pox.xm…

rs轨迹校验

最近发现有些网站的rs似乎上了轨迹校验&#xff0c;附图&#xff1a; 写了个解rscookie的插件&#xff0c;可以精准看到rs更改了那些校验点&#xff0c;需要做什么处理&#xff0c;就很舒服 有需要轨迹代码或者瑞数相关的可以联系 let v huaqu0727

Cmake qt_add_library

目录 基本用法 参数说明 示例 创建一个新的Qt项目 创建CMakeLists.txt ​​​​​创建库的源文件 创建主程序文件 构建项目 在Qt中&#xff0c;qt_add_library 是一个用于在CMake构建系统中添加库的命令。这个命令通常用于创建一个新的Qt库&#xff0c;并将其添加到CMa…

李彦宏:大模型公司要注重AI实际应用,写高考作文价值有限

李彦宏在2024世界人工智能大会上表示&#xff0c;大模型公司不应只关注写高考作文&#xff0c;而应更多地投入到实际应用中。这话说得有道理&#xff0c;不过我们也不能忽视探索性尝试的价值。接下来&#xff0c;我们来具体谈谈这个问题。 大模型在实际应用中的重要性 李彦宏…

性能测试:JMeter与Gatling的高级配置

性能测试是软件开发过程中不可或缺的一部分&#xff0c;它帮助我们确保应用在高负载下仍能保持良好的响应时间和稳定性。本文将深入探讨两种流行的性能测试工具&#xff1a;Apache JMeter和Gatling&#xff0c;并提供详细的高级配置指南以及Java代码示例。 Apache JMeter 高级…

uniapp小程序IOS端,uni.createInnerAudioContext()无声音

可能的问题 路径中有中文字符需要使用uni.getBackgroundAudioManager()播放其他问题 解决办法 首先我的路径中没有中文字符&#xff0c;如果有的&#xff0c;可能需要转义一下或者干脆不使用中文字符&#xff0c;第二个也是从其他博客中看到的&#xff0c;我这边分享一下我的…

【Qt】QTableView通过setColumnWidth设置了列宽无效

1. 解决 将模型设置给表格视图之后&#xff0c;再设置tableveiw的列宽。 2. 参考 https://blog.csdn.net/ml29895063/article/details/132716687

Feign远程调用,请求头丢失情况

现象 解决方案 import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolde…

编译开源车载Linux操作系统AGL

随着汽车行业的智能化和互联化趋势日益明显&#xff0c;车载系统作为汽车的重要组成部分&#xff0c;其性能和功能也受到了越来越多的关注。Linux作为一款开源的操作系统&#xff0c;具有稳定性高、安全性强、可定制性好等优点&#xff0c;因此成为了车载系统领域的热门选择。 …

我应该怎么办?(关于专升本篇!)

kimi&#xff0c;我需要你的帮助&#xff0c;我现在在湖北工业职业技术学院&#xff0c;我2025年将要开始进行专升本&#xff0c;预计在明年4月26日进行专升本&#xff0c;但是我现在很迷茫&#xff0c;自己感觉自己很懒惰&#xff0c;自己每天都过得很迷糊&#xff01; 面对专…

“unk0“ is not an ethernet device

nmap报错 Starting Nmap 7.94 ( https://nmap.org ) at 2024-07-05 14:47 中国标准时间 Only ethernet devices can be used for raw scans on Windows, and "unk0" is not an ethernet device. Use the --unprivileged option for this scan. QUITTING! 查看网卡…

SSM+汽车停车位共享APP-计算机毕业设计源码041534

摘 要 随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户停车难问题,本文设计并实现了APP停车位共享系统.该系统通过错峰停车达到车位利用率最大化.基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬件设计和系统实现三方面进行详细…

ffmpeg + opencv 把摄像头画面保存为mp4文件(Ubuntu24.04)

参考链接 ffmpeg opencv 把摄像头画面保存为mp4文件_ffmpeg转化摄像头mp4-CSDN博客 调试环境 Ubuntu24.04 ffmpeg 6.1.1 opencv 4.6 g 13.2.0 C源码 #include <iostream> #include <sys/time.h> #include <string>#ifdef __cplusplus extern "…

磁力天堂磁力链接搜索大全教程,如何使用磁力天堂。

磁力链接是一种特殊的下载链接&#xff0c;磁力链接可以理解为一个文件识别码&#xff0c;而并非具体的资源地址&#xff0c;下载软件需要拿着这个识别码去整个互联网(DHT网络)去寻找持有该资源的用户(节点)&#xff0c;如果找到则可以进行传输下载。一般年代越久远的磁力链接下…