3 回答

TA貢獻(xiàn)1820條經(jīng)驗 獲得超2個贊
為了更好地理解Fran?oisBOURLIEUX和Dalvik提供的答案,我建議您看一下Arpit Mathur的這張令人敬畏的視圖生命周期圖:

TA貢獻(xiàn)1815條經(jīng)驗 獲得超10個贊
invalidate()
invalidate()當(dāng)您要計劃重繪視圖時,調(diào)用完成。這將導(dǎo)致onDraw最終(很快,但不是立即)被調(diào)用。自定義視圖何時調(diào)用的一個示例是文本或背景顏色屬性已更改。
視圖將被重繪,但是大小不會改變。
requestLayout()
如果關(guān)于視圖的某些更改會影響大小,則應(yīng)致電requestLayout()。這將觸發(fā)onMeasure并onLayout不僅是這個觀點,但一路上揚(yáng)父視圖的線。
不能保證調(diào)用requestLayout()會導(dǎo)致onDraw(與接受的答案中的圖相反),因此通常將其與結(jié)合使用invalidate()。
invalidate();
requestLayout();
例如,自定義標(biāo)簽的text屬性發(fā)生更改時。標(biāo)簽會改變尺寸,因此需要重新測量和重新繪制。
forceLayout()
當(dāng)requestLayout()在父視圖組上調(diào)用時,不需要重新測量并重傳其子視圖。但是,如果在重新測量和重排中應(yīng)包括一個孩子,則可以呼叫forceLayout()該孩子。forceLayout()僅在子代requestLayout()與其直接父代一起出現(xiàn)時才對子代起作用。forceLayout()本身調(diào)用不會起作用,因為它不會觸發(fā)requestLayout()視圖樹。
閱讀此問答以獲取有關(guān)的詳細(xì)說明forceLayout()。

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
正如您在代碼中所forceLayout()看到的那樣,它僅將視圖標(biāo)記為“需要重新布局”,但是它既沒有計劃也沒有觸發(fā)該重新布局。重新布局將不會發(fā)生,直到將來某個時候由于其他原因布置視圖的父級。
使用forceLayout()和時,還有一個更大的問題requestLayout():
假設(shè)您已經(jīng)調(diào)用forceLayout()了一個視圖?,F(xiàn)在,當(dāng)調(diào)用requestLayout()該視圖的后代時,Android將遞歸調(diào)用requestLayout()該后代的祖先。問題是它將在您調(diào)用的視圖處停止遞歸forceLayout()。因此,該requestLayout()調(diào)用將永遠(yuǎn)不會到達(dá)視圖根,因此也不會調(diào)度布局遍歷。視圖層次結(jié)構(gòu)的整個子樹都在等待布局,并且調(diào)用requestLayout()該子樹的任何視圖都不會導(dǎo)致布局。僅requestLayout()在該子樹之外調(diào)用任何視圖都會破壞該咒語。
我會考慮的實現(xiàn)forceLayout()(以及它如何requestLayout()受到破壞,因此您永遠(yuǎn)不要在代碼中使用該函數(shù)。
- 3 回答
- 0 關(guān)注
- 1495 瀏覽
添加回答
舉報