在實際開發會用到layoutinflater這個類,它的作用類似於 findviewbyid()。
layoutinflater是用來找layout下xml布局檔案,並且例項化,而findviewbyid()是找具體xml下的具體 widget控制項(如:button,textview等)。
對於乙個沒有被載入或者想要動態載入的介面,都需要使用layoutinflater.inflate()來載入。
什麼叫做動態載入的介面呢?
在應用中有時候需要通過某些點選效果動態地新增布局,而不是直接載入完整的xml布局檔案,就需要動態載入。
接下來看一下layoutinflater的用法。
inflate方法有三個引數(int resource, viewgroup root, boolean attachtoroot)。
resource:需要載入布局檔案的id,意思是需要將這個布局檔案中載入到activity中來操作。
root:需要附加到resource資源檔案的根控制項,什麼意思呢,就是inflate()會返回乙個view物件,如果第三個引數attachtoroot為true,就將這個root作為根物件返回,否則僅僅將這個root物件的layoutparams屬性附加到resource物件的根布局物件上,也就是布局檔案resource的最外層的view上,比如是乙個linearlayout或者其它的layout物件。
attachtoroot:是否將root附加到布局檔案的根檢視上
很難理解的話,我們來看下面一段**。
我的activity_main布局如下
<?xml versio`這裡寫**片`n="1.0" encoding="utf-8"?>
xmlns:android=""
android:id="@+id/qwe"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
linearlayout>
我還有乙個linearlayout如下
<?xml version="1.0" encoding="utf-8"?>
xmlns:android=""
android:id="@+id/asd"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorprimarydark"
android:gr**ity="center"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="這是乙個按鈕"/>
linearlayout>
我現在想把這個linearlayout布局新增到我的activity_main中去,可以這麼做。
package com.example.inflatertest;
import android.os.bundle;
import android.view.layoutinflater;
import android.widget.linearlayout;
public
class
mainactivity
extends
@override
protected
void
oncreate(bundle s**edinstancestate)
}
效果如圖
inflate方法返回的是乙個view,而我並沒有新增這個返回的view就已經將linearlayout新增進來了。因為我的第三個引數設定為true,表示將第乙個引數所指定的布局新增到第二個引數的view中。
如果多寫那麼一行**。
package com.example.inflatertest;
import android.os.bundle;
import android.view.layoutinflater;
import android.view.view;
import android.widget.linearlayout;
public
class
mainactivity
extends
@override
protected
void
oncreate(bundle s**edinstancestate)
}
會丟擲如下錯誤:
原因就是因為當第三個引數為true時,會自動將第乙個引數所指定的view新增到第二個引數所指定的view中。
下面我們再來看看當第三個引數attachtoroot為false時的情況。
當attachtoroot為false時,表示不將第乙個引數所指定的view新增到第二個引數root中去。因為我們想要新增布局可以把第三個引數設為true,那我們為什麼這裡要設為false呢?我們在設定控制項的時候,都會設定layout_width和layout_height,這兩個屬性表示的是在容器裡的大小,當然也意味著,這兩個屬性必須要在容器裡才有意義,否則沒有意義。
這就意味著如果我直接將linearlayout載入進來而不給它指定乙個父布局,則inflate布局的根節點的layout_width和layout_height屬性將會失效(因為這個時候linearlayout將不處於任何容器中,那麼它的根節點的寬高自然會失效)。
如果我想讓linearlayout的根節點有效,又不想讓其處於某乙個容器中,那我就可以設定root不為null,而attachtoroot為false。
還是那兩個布局,這次我想新增該怎麼辦呢?
package com.example.inflatertest;
import android.os.bundle;
import android.view.layoutinflater;
import android.view.view;
import android.widget.linearlayout;
public
class
mainactivity
extends
@override
protected
void
oncreate(bundle s**edinstancestate)
}
效果與前面一致。 LayoutInflater類簡單使用
layoutinflater 是乙個抽象類,在文件中如下宣告 public abstract class layoutinflater extends object 獲得 layoutinflater 例項的三種方式 1.layoutinflater inflater getlayoutinflat...
常見的LayoutInflater類
抽象類layoutinflater,其作用類似於findviewbyid 方法。不過它是用來找res layout下的xml布局檔案,並且例項化 而findviewbyid 方法僅僅是通過控制項id查詢某xml布局檔案下具體widget控制項 如button textview等 兩者具體用途 1.對...
獲取LayoutInflater例項
在實際開發中layoutinflater這個類還是非常有用的,它的作用類似於findviewbyid 不同點是layoutinflater是用來找res layout 下的xml布局檔案,並且例項化 而findviewbyid 是找xml布局檔案下的具體widget控制項 如button textv...