極少情況出現(xiàn)View的Measure失敗問(wèn)題解析

背景描述

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


image.png

期望展示長(zhǎng)度


image.png

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

image.png

layoutInspector

image.png

關(guān)鍵代碼

image.png

image.png

image.png

然后就很奇怪的事情發(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中


image.png

image.png

所以。在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

image.png

isRequestLayout

image.png

requestLayout

image.png

layout

image.png

measure

image.png

image.png

所以下一個(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ì)不同步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容