Android 對 LayoutInflater.inflate()方法的深入理解

LayoutInflater.inflate() 方法有一個接收三個參數(shù)的方法重載

inflate(int resource, ViewGroup root, boolean attachToRoot)

第三個參數(shù)attachToRoot可能很多人疑問了很長時間澈魄,我之前也不太理解汽烦,那么先將結(jié)論說一下称勋,稍后再做解釋

  1. 如果root為null才避,attachToRoot將失去作用春哨,設置任何值都沒有意義腰吟。
  2. 如果root不為null汰聋,attachToRoot設為true门粪,則會給加載的布局文件的指定一個父布局,即root烹困。
  3. 如果root不為null玄妈,attachToRoot設為false,則會將布局文件最外層的所有l(wèi)ayout屬性進行設置髓梅,當該view被添加到父view當中時拟蜻,這些layout屬性會自動生效。
  4. 在不設置attachToRoot參數(shù)的情況下枯饿,如果root不為null酝锅,attachToRoot參數(shù)默認為true。

直接看結(jié)論的話奢方,未必每一個人都能很容易的理解搔扁,下邊舉個例子說明

  • 先寫一個activity_main.xml,這個布局文件很簡單蟋字,只有一個空的LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</LinearLayout>
  • 再寫一個button_layout_1.xml稿蹲,這個布局我們加入一個Button按鈕,寬高固定鹊奖,并且外層沒有父Layout
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="50dp"
    android:text="Button">

</Button>
  • 最后寫一個button_layout_2.xml苛聘,加入Button按鈕,外層嵌套一個父Layout忠聚,父Layout的寬高固定
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="50dp">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />

</RelativeLayout>

方法1. 如果我們用以下代碼來解析button_layout_1设哗,那么中Button所設置的寬高是不生效的

ViewGroup mainLayout = (LinearLayout) findViewById(R.id.main_layout);
View buttonLayout = LayoutInflater.from(this).inflate(R.layout.button_layout_1, null);
mainLayout.addView(buttonLayout);

方法2. 而如果我們設置了inflate方法的root參數(shù),并且attachToRoot設為true两蟀,那么Button所設置的寬高就生效了

ViewGroup mainLayout = (LinearLayout) findViewById(R.id.main_layout);
View buttonLayout = LayoutInflater.from(this).inflate(R.layout.button_layout_1, mainLayout, true);
// 不需要再addView
// mainLayout.addView(buttonLayout);

這是為什么呢网梢?

首先,layout_width和layout_height 其實是用于設置View在布局中的大小的垫竞,也就是說澎粟,View必須存在于一個布局中蛀序,之后如果將layout_width、layout_height 設置成match_parent 或 wrap_content 或 固定的數(shù)值才會生效活烙,這也是為什么這兩個屬性叫作layout_width和layout_height徐裸,而不是width和height

方法1中root設為null,Button外層又沒有父Layout啸盏,所以Button所設置的寬高并沒有生效

方法2中root設為mainLayout重贺,attachToRoot設為true,會給加載的布局文件的指定一個父布局回懦,所以Button的寬高就生效了气笙,這也就對應了最上邊的結(jié)論2

那么我們再來看button_layout_2

方法1. 設置root為null,Button的父布局RelativeLayout設置的寬高就無效

ViewGroup mainLayout = (LinearLayout) findViewById(R.id.main_layout);
View buttonLayout = LayoutInflater.from(this).inflate(R.layout.button_layout_2, null);
mainLayout.addView(buttonLayout);

方法2. 設置root設為mainLayout怯晕,attachToRoot設為false潜圃,Button的父布局RelativeLayout設置的寬高就生效了

ViewGroup mainLayout = (LinearLayout) findViewById(R.id.main_layout);
View buttonLayout = LayoutInflater.from(this).inflate(R.layout.button_layout_2, mainLayout, false);
mainLayout.addView(buttonLayout);

這也就對應了最上邊的結(jié)論3:如果root不為null,attachToRoot設為false舟茶,則會將布局文件最外層的所有l(wèi)ayout屬性進行設置谭期,當該view被添加到父view當中時,這些layout屬性會自動生效

好了吧凉,這下相信大家應該理解inflate()方法 attachToRoot參數(shù)的含義了吧隧出!

Demo地址:https://github.com/jaycee88/LayoutInflaterDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阀捅,隨后出現(xiàn)的幾起案子胀瞪,更是在濱河造成了極大的恐慌,老刑警劉巖饲鄙,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凄诞,死亡現(xiàn)場離奇詭異,居然都是意外死亡傍妒,警方通過查閱死者的電腦和手機幔摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤练,“玉大人,你說我怎么就攤上這事驱负∴戮粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵跃脊,是天一觀的道長宇挫。 經(jīng)常有香客問我,道長酪术,這世上最難降的妖魔是什么器瘪? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任翠储,我火速辦了婚禮,結(jié)果婚禮上橡疼,老公的妹妹穿的比我還像新娘援所。我一直安慰自己,他們只是感情好欣除,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布住拭。 她就那樣靜靜地躺著,像睡著了一般历帚。 火紅的嫁衣襯著肌膚如雪滔岳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天挽牢,我揣著相機與錄音谱煤,去河邊找鬼。 笑死禽拔,一個胖子當著我的面吹牛刘离,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奏赘,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寥闪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磨淌?” 一聲冷哼從身側(cè)響起疲憋,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梁只,沒想到半個月后缚柳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡搪锣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年秋忙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片构舟。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡灰追,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狗超,到底是詐尸還是另有隱情弹澎,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布努咐,位于F島的核電站苦蒿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渗稍。R本人自食惡果不足惜佩迟,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一团滥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灸姊,春花似錦躺涝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俺猿,卻和暖如春格仲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谊惭。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工圈盔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悄雅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓众眨,卻偏偏與公主長得像容诬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子放案,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容