動(dòng)態(tài)布局LayoutInflater.inflate() 方法解析

我們開發(fā)時(shí),有時(shí)候會(huì)有動(dòng)態(tài)加載布局的需求,A情況加載一個(gè)布局,B情況加載另一個(gè)布局。

下面簡(jiǎn)單介紹一下動(dòng)態(tài)布局涉及到的知識(shí)點(diǎn)以及用到的函數(shù)。

1.LayoutInflater的用法

LayoutInflater可以用來實(shí)例化 XML文件,使它成為一個(gè)View對(duì)象。

1.1 LayoutInflater實(shí)例化

? 有三種方法可以將LayoutInflater實(shí)例化:

  • LayoutInflater inflater1 = LayoutInflater.from(this);
  • LayoutInflater inflater2 = getLayoutInflater();
  • LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    第一種寫法跟第三種寫法本質(zhì)是一樣的。

拿到LayoutInflater實(shí)例之后,可以調(diào)用它的inflate()方法加載布局了。

1.2 inflate()的兩種常用方法

[inflate](http://www.android-doc.com/reference/android/view/LayoutInflater.html#inflate(int, android.view.ViewGroup))(int resource,ViewGroup root)

[inflate](http://www.android-doc.com/reference/android/view/LayoutInflater.html#inflate(int, android.view.ViewGroup, boolean))(int resource,ViewGroup root, boolean attachToRoot)

第一個(gè)參數(shù)resource:ID for an XML layout resource to load (e.g., R.layout.main_page)
第二個(gè)參數(shù)root:布局的外部再嵌套一層父布局,不需要可以填null.
第三個(gè)參數(shù)attachToRoot:是否把選取的視圖加入到root中。

引用程大治的分析:

如果attachToRoot是true的話,那第一個(gè)參數(shù)的layout文件就會(huì)被填充并附加在第二個(gè)參數(shù)所指定的ViewGroup內(nèi)。方法返回結(jié)合后的View,根元素是第二個(gè)參數(shù)ViewGroup。如果是false的話,第一個(gè)參數(shù)所指定的layout文件會(huì)被填充并作為View返回。這個(gè)View的根元素就是layout文件的根元素。不管是true還是false,都需要ViewGroup的LayoutParams來正確的測(cè)量與放置layout文件所產(chǎn)生的View對(duì)象。

1.3 舉個(gè)例子

LayoutInflater layoutInflater = LayoutInflater.from(this);
View bottom_tab = layoutInflater.inflate(R.layout.include_bottom_tab,null);

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.XX);
linearLayout.addView(bottom_tab);

這樣就可以動(dòng)態(tài)地將指定的布局文件加到指定XX布局中了。

如果上述的include_bottom_tab的布局文件是類似這樣的,沒有父布局:

<Button 
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="30dp"  
    android:layout_height="80dp"  
    android:text="Button" >  
</Button>  

那么layout_xx屬性都會(huì)無效。詳見下一部分的解釋。

如果如果上述的include_bottom_tab的布局文件有父布局,那么可以直接設(shè)置布局的具體位置,如居中等。

2.關(guān)于layout_XX

首先認(rèn)識(shí)一下layout_width和layout_height這個(gè)兩個(gè)屬性 。
顧名思義,layout_xx 是用來設(shè)置當(dāng)前View在布局中的大小或者位置的,而不是我們默以為的設(shè)置View的大小。

同時(shí)也有人會(huì)有這樣的疑問,為什么布局最外層的布局又可以設(shè)置大小呢? 這是因?yàn)樵趕etContentView()方法中,Android會(huì)自動(dòng)在布局文件的最外層再嵌套一個(gè)FrameLayout,所以layout_width和layout_height屬性才會(huì)有效果。

看這張圖片可以更好地理解:(圖來自@郭霖博客)
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容