ConstraintLayout遇到的坑

背景

为了降低app的卡顿率,项目做了一次优化,将首页的的滑动控件viewPager改成了viewPager2,前者是一次性加载所有的布局文件,后者只会加载目标页面的布局文件,减少了计算和绘制的时间。在开发完后,发现了一个很奇怪的bug。如左图所示,右图是正常图片,看了各控件的展示,发现内部控件的宽高为0。

结论

先说结论,经过长时间的排查比对,发现问题ConstraintLayout布局上,只要它的子控件设置了paddingStart和paddindEnd,就会显示不正常,解决方法就是替换成paddingLeft和paddingRight,就没问题了。

排查过程

布局显示不正常,根据我的开发经验, 很可能是跟上编舞者绘制节奏,所以我加了一个post()方法,给他一个单独的绘制时间,结果不如我意,还是原样。调用requestLayout()和invalidate(),也都没有效果。

经验不顶用,只能从问题本身出发,这次优化的改动是改成viewPager2,它内部是通过recycleView实现的,那会不会recycleView做了什么处理?这个view起先试隐藏的,满足条件后才会展示。我研究了viewPager2的源码以及recycleView的源码,发现它做的仅仅是缓存,对于addView并没有干预,这个线索又断了.....。


    <com.view.widget.LastReadView
        android:id="@+id/last_read_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_marginStart="@dimen/dp_12"
        android:layout_marginEnd="@dimen/dp_12"
        android:layout_marginBottom="@dimen/dp_14"
        android:minHeight="@dimen/dp_68"
        android:visibility="gone"
        tools:visibility="visible" />

我再试着从布局本身出发,我想到了三种方案,都能解决这个问题。

1.将lastReadView的根布局改成merge标签。

2.在获取到数据后inflateView,然后addView。

3.将LastReadView继承自FrameLayout(原先继承ConstraintLayout)。

虽然问题解决了,但是真正原因是什么呢?好奇心驱动着我继续向前探索。我想研究ConstraintLayout的源码,发现本地sdk内尽然找不到源码,于是想到到外网上找,终于功夫不负有心问,找到了androidx.constraintlayout.core包的源码,从头看了一遍,大致意思懂了,还是没有找到答案。它在和我捉迷藏嘛,还躲的这么深,最后只能用最笨的办法,穷举法。写demo,把变量一个一个去掉,代码一行一行比对,发现了当我把paddingStart和paddingEnd全部改成对应的paddingLeft和paddingRight时,可以正常显示了,终于找到了元凶,这一刻内心的喜悦溢于言表,不枉我周末花的大半天时间。

为什么paddingStart会导致测量出错,这个原因肯定是藏在源码里,我现在还没找到答案,如果有知道原因的好心人,请留言,我也会继续探索真正的原因。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 路由传递参数 query、params

1、to的对象写法,绑定参数 <template> 2 <ul> 3 <li v-for"m in messlist" :key"m.id"> 4 <router-link :to"{ //使用params时&#xff0c;这个路径必须用name及别名......name: xiangqing, path: /bbb/message/deta…

【GreenHills】解决GHS对于“//”注释符号进行报错的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决GHS对于使用“//”进行注释内容进行报错的问题 2、 问题场景 在代码中经常使用“//”进行内容注释。但是&#xff0c;在GHS中发现所有的注释信息都被显示了报错。报错信息如下图2-1。 图2-1 3、软硬件环境 1&a…

关于LayUI弹出层请求一次其他网页后无法再次点击按钮问题

问题描述 使用layer弹出层去请求另一个页面&#xff0c;关闭弹窗后本页面按钮无法点击也不报错,如下面弹窗代码 layer.open({type: 1,area: [500px, 400px],title: 编辑信息,shade: 0.6,shadeClose: true,maxmin: false,anim: 0,success: function (layero, index) {$.ajax({u…

【网络编程开发】7.TCP可靠传输的原理

7.TCP可靠传输的原理 TCP实现可靠传输的原理主要基于序列号和确认应答、超时重传、滑动窗口、连接管理机制以及拥塞控制等多重机制。 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;即传输控制协议&#xff0c;是网络通信中的一种重要协议&#xff0…

守护云端数据安全—安当透明加密TDE解决方案

国家安全部官微6月5日消息&#xff0c;云存储是一种新兴网络存储技术。近年来&#xff0c;随着网络“云”功能不断普及&#xff0c;“云端”数据也成为了境外间谍情报机关关注的重点&#xff0c;他们通过网络攻击、植入木马等各种手段&#xff0c;试图窃取我敏感信息和涉密数据…

将你的IOS升级到18

一、登录到苹果开发者网站 Apple Developer 二、选择IOS 18 三、选择Download 四、登录appleid 五、显示下载页面 六、登录你的手机

一款优秀的下载和共享工具

一、简介 1、它以舒适和快速的方式下载Internet文件&#xff0c;同时支持断点续传和嗅探视频音频的功能。 它具有站点抓取、批量下载队列和计划任务下载等功能&#xff0c;可以接管所有浏览器的下载任务&#xff0c;包括Edge&#xff0c;Firefox和Chrome等主流浏览器。 对于用…

螺栓拧紧力矩标准

据德国VOITH提供Nm换算所得 螺栓扭矩表 (单位&#xff1a;Nm、Kgm) Nm0.101972mKg M6~M24螺钉或螺母的拧紧力矩操作者参考 ★对于设计图纸有明确力矩要求的;应按图纸要求执行… 套管螺母紧固力矩Q/STB B07833-1998 材料 HPb63-3Y2 直通式压注油杯 Q/STB B07020-1998螺纹M6、…

【测试开发】

1.一个优秀的软件测试人员具备的素质 综合能力 沟通能力快速学习的能力开发能力文字能力 掌握自动化测试技术 掌握自动化测试技术&#xff0c;可以把你从大量重复性劳动中解脱出来&#xff0c;这样可以把更多的经历都花在更多类型的测试上 优秀的测试用例设计能力 测试用例设计…

基于springboot实现高校专业实习管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现高校专业实习管理系统的设计演示 摘要 随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的高校专业实…

Hausdorff距离定义与计算方法

当谈论距离时&#xff0c;我们通常指的是最短距离&#xff1a;例如&#xff0c;如果说点 X 距离多边形 P 的距离为 D&#xff0c;我们通常假设 D 是从 X 到 P 的最近点的距离。同样的逻辑也适用于多边形&#xff1a;如果两个多边形 A 和 B 彼此相距一定距离&#xff0c;我们通常…

前端 JS 经典:动态执行 JS

前言&#xff1a;怎么将字符串当代码执行。有 4 中方式实现 eval、setTimeout、创建 script 标签、new Function 1. eval 特点&#xff1a;同步执行&#xff0c;当前作用域 var name "yq"; function exec(string) {var name "yqcoder";eval(string); …

数据结构---力扣232.用栈实现队列(C

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a; 栈 是 后进先出 队列 是 先进先出 让一个栈&#xff08;s1&#xff09;作为空栈&#xff0c;入队列的栈 另一个&#xff08;s2&#xff09;作为非空栈&#xff0c;出队列的栈…

经典的带环链表问题(链表补充)

环形链表1 运用快慢指针的方法&#xff0c;fast ,slow从头节点出发&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;若有环&#xff0c;快指针先进环&#xff0c;后续如果慢指针和快指针相遇&#xff0c;则链表带环。转换成了追击问题。 struct ListNode {int v…

品牌与产品:消费者决策的经济逻辑与品牌宣传的战略意义

在当今日益全球化的经济环境中&#xff0c;品牌与产品之间的关系对于企业的成功与否起着至关重要的作用。然而&#xff0c;在消费者做出购买决策时&#xff0c;他们到底是在选择产品本身&#xff0c;还是在选择附着在产品之上的品牌价值&#xff1f;同样&#xff0c;当客户选择…

基于遗传优化算法的风力机位置布局matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的风力机位置布局matlab仿真&#xff0c;风力机位置布局优化是风能转换系统设计中的一个重要环节&#xff0c;旨在最大化风场的整体发电效率。仿…

MySQL----排序ORDER BY

在对数据进行处理的时候&#xff0c;我们通常需要对读取的数据进行排序。而 MySQL 的也提供了 ORDER BY 语句来满足我们的排序要求。 ORDER BY 可以按照一个或多个列的值进行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 语法 SELECT column1…

Photoshop(PS)高效使用小技巧大揭秘

Photoshop&#xff0c;简称PS&#xff0c;是设计师和摄影师的得力助手。为了让你在使用PS时更加得心应手&#xff0c;我们整理了一系列高效使用小技巧&#xff0c;助你提升工作效率&#xff0c;释放创造力&#xff01; 一、快捷键大法 ALT键鼠标滚轮&#xff1a;快速放大和缩…

【C++题解】1962. 数值计算

问题&#xff1a;1962. 数值计算 类型&#xff1a;简单循环 题目描述&#xff1a; 给出一个不多于 5 位的非负整数&#xff0c;要求 1、 求出它是几位数 2、 分别输出每一位数字 3、 按逆序输出各位数字&#xff0c;例如原数为 321 ,应输出 123。 输入&#xff1a; 一个不大…

C语言 | Leetcode C语言题解之第146题LRU缓存

题目&#xff1a; 题解&#xff1a; typedef struct {int key;int val;UT_hash_handle hh; } LRUCache;LRUCache* cache NULL; int g_capacity 0; LRUCache** lRUCacheCreate(int capacity) {g_capacity capacity;return &cache; }int lRUCacheGet(LRUCache** obj, int…