LayoutParams 你知道多少?

2021-09-25 07:25:00 字數 3724 閱讀 8814

從概念講起

layoutparams,顧名思義,就是布局引數。而且大多數人對此都是司空見慣,我們 xml 檔案裡面的每乙個 view 都會接觸到 layout_*** 這樣的屬性,這實際上就是對布局引數的描述。大概大家也就清楚了,layout_ 這樣開頭的東西都不屬於 view,而是控制具體顯示在**。

layoutparams 都有哪些初始化方法

通常來說,我們都會把我們的控制項放在 xml 檔案中,即使我們有時候需要對螢幕做比較「取巧」的適配,會直接通過 view.getlayoutparams() 這樣的方法獲取 layoutparams 的例項,但我們接觸的少並不代表它的初始化方法不重要。

實際上,用**寫出來的 view 載入效率要比在 xml 中載入快上大約 1 倍。只是在如今手機配置都比較高的情況下,我們常常忽略了這種方式。

我們來看看 viewgroup.layoutparams 到底有哪些構造方法。

public

layoutparams

(context c, attributeset attrs)

public

layoutparams

(int width,

int height)

public

layoutparams

(layoutparams source)

layoutparams()

marginlayoutparams

除去最後乙個放給 marginlayoutparams 做處理的方法外,我們在 viewgroup 中還有 3 個構造方法。他們分別負責給 xml 處理、直接讓使用者指定寬高、還有類似集合的 addall() 這樣的方式的賦值方法。

實際上,viewgroup 的子類的 layoutparams 類擁有更多的構造方法,感興趣的自己翻閱原始碼檢視。在這裡我想更加強調一下我上面提到的

marginlayoutparams 繼承於 viewgroup.layoutparams。

public

static

class

marginlayoutparams

extends

viewgroup.layoutparams

else

// ... something

}}

一看**,自然就清楚了,為什麼我們以前會發現在 xml 布局裡, layout_margin 屬性的值會覆蓋 layout_marginleft 與 layout_marginright 等屬性的值。

實際上,事實上,絕大部分容器控制項都是直接繼承 viewgroup.marginlayoutparams 而非 viewgroup.layoutparams。所以我們再自定義 layoutparams 的時候記得繼承 viewgroup.marginlayoutparams 。

在**裡面使用 layoutparams

前面介紹了 layoutparams 的幾種構造方法,我們下面以 linearlayout.layoutparams 來看看幾種簡單的使用方式。

val textview1 =

textview

(this

)textview1.text =

"不指定 layoutparams"

layout.

addview

(textview1)

val textview2 =

textview

(this

)textview2.text =

"手動指定 layoutparams"

textview2.layoutparams = linearlayout.

layoutparams

(linearlayout.layoutparams.wrap_content, linearlayout.layoutparams.wrap_content)

layout.

addview

(textview2)

val textview3 =

textview

(this

)textview3.text =

"手動傳遞 layoutparams"

textview3.layoutparams = linearlayout.

layoutparams

(viewgroup.

layoutparams

(100

,100))

layout.

addview

(textview3)

我們看看 addview() 都做了什麼。

public

void

addview

(view child)

public

void

addview

(view child,

int index)

layoutparams params = child.

getlayoutparams()

;if(params == null)

}addview

(child, index, params);}

@override

protected layoutparams generatedefaultlayoutparams()

else

if(morientation == vertical)

return null;

}public

void

addview

(view child,

int index, layoutparams params)

if(child == null)

requestlayout()

;invalidate

(true);

addviewinner

(child, index, params,

false);

}private

void

addviewinner

(view child,

int index, layoutparams params,

boolean preventrequestlayout)

// ...

}@override

protected

boolean

checklayoutparams

(viewgroup.layoutparams p)

看起來 viewgroup 真是煞費苦心,如果我們沒有給 view 設定 layoutparams,則系統會幫我們根據 orientation 設定預設的 layoutparams。甚至是我們即使在 addview() 之前設定了錯誤的 layoutparams 值,系統也會我們幫我們進行糾正。

雖然系統已經做的足夠完善,幫我們各種矯正錯誤,但在 addview() 之後,我們還強行設定錯誤的 layoutparams,那還是一定會報 classcastexception 的。

實際上 google 出的 flexboxlayout 已經做的相當完美。

當然如果使用的 recyclerview,還可以自己寫乙個 flowlayoutmanager 進行處理。

##讀者福利限時分享

Android中LayoutParams的用法

寧願做過了後悔,也不要錯過了後悔。本講內容 layoutparams的用法 一 layoutparams的認識 從官方文件可知layoutparams繼承於android.view.viewgroup.layoutparams.layoutparams相當於乙個layout的資訊包,它封裝了layo...

你可曾知道

你可曾知道 致小公尺 文 劉志勇 像白天與黑夜那樣遙遠 你我只能相逢在黎明與黃昏 壯麗的旭日 燦爛的朝霞 夜幕下的繁星點點 都承載著我對你的思念 因你的出現 乙個本已經黯淡無光的生命重新綻放色彩 你可曾知道 你不在身邊的每一分鐘 寂寞都是一把長長的雙刃劍 讓我沉思 讓我奮起 讓我體會愛的意義 在我心...

你可知道你所求的

你可知道你所求的,是受造物中最為昂貴的?你要的是乙個女子的心 她的生命和珍貴的愛。你可知道你像小孩子要求玩具,索討著一樣無價之寶?你莽莽撞撞所求的,卻是別人願以生命換取的。你列出我應盡的責任,以男人的態度質詢我。現在你要站在我女性的靈魂門外,直到我向你詢問。你總希望羊肉熱騰騰,衣衫 襪子不破洞。我卻...