背景描述
一個(gè)簡(jiǎn)單的dmoe,發(fā)現(xiàn)TextView寬度顯示不完全,內(nèi)容是0123456789,但是text的寬度卻不夠顯示

期望展示長(zhǎng)度

頁(yè)面結(jié)構(gòu)

layoutInspector

關(guān)鍵代碼



然后就很奇怪的事情發(fā)生了。在我們初始化的時(shí)候后,textView內(nèi)容明明是0123456789,但是寬度就是明顯不夠。
原理分析
堆棧分析
其實(shí)從日志就可以看出端倪了。就是setTextView之后調(diào)用了requestLayout但是為啥最后沒(méi)用調(diào)用onMeasure?導(dǎo)致寬度沒(méi)有變化
具體原因呢。實(shí)際上是因?yàn)?,ViewPager的onScrolled方法的首次回調(diào)是存在于ViewGroup的onLayout中


所以。在CustomerFrame里面的onLayout->ViewPager.onScrolled->...->customerTextView.setText->requsetLayout-> .標(biāo)臟邏輯... 但是馬上就被CustomerFrame的onLayout后續(xù)邏輯,調(diào)用到customerTextView.layout方法了。就把customerTextView的mPrivateFlags標(biāo)志位改成了非layouting狀態(tài)了(也就是isRequestLayout=false)。
mPrivateFlags

isRequestLayout

requestLayout

layout

measure


所以下一個(gè)vsync信號(hào)過(guò)來(lái)之后雖然分發(fā)到CustomerFrame的meaure。但是由于customerTextView的狀態(tài)已經(jīng)不是isLayoutRequested的狀態(tài)了。就不會(huì)觸發(fā)CustomerFrame的onMeasure。導(dǎo)致測(cè)量失敗分發(fā),寬度停留在上一個(gè)位置
結(jié)論
?。。。。?!不要在parent的onLayout方法里面去調(diào)用View的狀態(tài)修改。尤其是涉及measure相關(guān)的,狀態(tài)可能會(huì)不同步