极少情况出现View的Measure失败问题解析

背景描述

一个简单的dmoe,发现TextView宽度显示不完全,内容是0123456789,但是text的宽度却不够显示


image.png

期望展示长度


image.png

页面结构

image.png

layoutInspector

image.png

关键代码

image.png

image.png

image.png

然后就很奇怪的事情发生了。在我们初始化的时候后,textView内容明明是0123456789,但是宽度就是明显不够。

原理分析

堆栈分析

其实从日志就可以看出端倪了。就是setTextView之后调用了requestLayout但是为啥最后没用调用onMeasure?导致宽度没有变化
具体原因呢。实际上是因为,ViewPager的onScrolled方法的首次回调是存在于ViewGroup的onLayout中


image.png

image.png

所以。在CustomerFrame里面的onLayout->ViewPager.onScrolled->...->customerTextView.setText->requsetLayout-> .标脏逻辑... 但是马上就被CustomerFrame的onLayout后续逻辑,调用到customerTextView.layout方法了。就把customerTextView的mPrivateFlags标志位改成了非layouting状态了(也就是isRequestLayout=false)。

mPrivateFlags

image.png

isRequestLayout

image.png

requestLayout

image.png

layout

image.png

measure

image.png

image.png

所以下一个vsync信号过来之后虽然分发到CustomerFrame的meaure。但是由于customerTextView的状态已经不是isLayoutRequested的状态了。就不会触发CustomerFrame的onMeasure。导致测量失败分发,宽度停留在上一个位置

结论

!!!!!!不要在parent的onLayout方法里面去调用View的状态修改。尤其是涉及measure相关的,状态可能会不同步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容