從概念講起
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...
你可曾知道
你可曾知道 致小公尺 文 劉志勇 像白天與黑夜那樣遙遠 你我只能相逢在黎明與黃昏 壯麗的旭日 燦爛的朝霞 夜幕下的繁星點點 都承載著我對你的思念 因你的出現 乙個本已經黯淡無光的生命重新綻放色彩 你可曾知道 你不在身邊的每一分鐘 寂寞都是一把長長的雙刃劍 讓我沉思 讓我奮起 讓我體會愛的意義 在我心...
你可知道你所求的
你可知道你所求的,是受造物中最為昂貴的?你要的是乙個女子的心 她的生命和珍貴的愛。你可知道你像小孩子要求玩具,索討著一樣無價之寶?你莽莽撞撞所求的,卻是別人願以生命換取的。你列出我應盡的責任,以男人的態度質詢我。現在你要站在我女性的靈魂門外,直到我向你詢問。你總希望羊肉熱騰騰,衣衫 襪子不破洞。我卻...