背景描述
一个简单的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相关的,状态可能会不同步