Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> LayoutInflater——inflate方法不同參數的區別

LayoutInflater——inflate方法不同參數的區別

編輯:關於Android編程

LayoutInflater有兩個參數inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot),inflate(XmlPullParser parser, ViewGroup root)它們的區別在於:

首先,LayoutInflater這個類是用來干嘛的呢?

我們最常用的便是LayoutInflater的inflate方法,這個方法重載了四種調用方式,分別為:

1.public View inflate(int resource, ViewGroup root)

2.public View inflate(int resource, ViewGroup root, boolean attachToRoot)

3.public View inflate(XmlPullParser parser, ViewGroup root)

4.public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)

這四種使用方式中,我們最常用的是第一種方式,inflate方法的主要作用就是將xml轉換成一個View對象,用於動態的創建布局。雖然重載了四個方法,但是這四種方法最終調用的,還是第四種方式。第四種方式也很好理解,內部實現原理就是利用Pull解析器,對Xml文件進行解析,然後返回View對象。

我們以我們經常使用的第一種形式為例,你在重寫BaseAdapter的getView方法的時候是否這樣做過

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflate(R.layout.item_row, null);
    }
    return convertView;
}
inflate方法有三個參數,分別是

1.resource 布局的資源id

2.root 填充的根視圖

 

3.

attachToRoot是否將載入的視圖綁定到根視圖中

在這個例子中,我們將root參數設為空,功能確實實現了,但是這裡還隱藏著一個隱患,這種方式並不是inflate正確的使用姿勢,下面我們通過一個Demo,來說一下這樣使用造成的弊端。

首先,我們建立一個這樣的項目

\

這裡三個界面,一個主界面,兩個測試界面,布局文件中,主界面只負責界面跳轉,兩個測試界面都是一個簡單的Listview,item布局顯示效果如下

\

對應的布局文件如下

兩個文件最關鍵的區別就一句話,

在getView方法中,OneActivity是

 

convertView = inflater.inflate(R.layout.item_list, null);

在getView方法中,TwoActivity是

convertView = inflater.inflate(R.layout.item_list, parent,false);

我們先看一下顯示效果,再說兩者的區別

OneActivity效果

\

TwoActivity的顯示效果

\

我們可以很明顯的看出來,使用第一種方式,根布局的高度設置60dp沒有起作用,系統還是按照包裹內容的方式加載的,為什麼會產生這種效果呢?我們從需要inflate方法的源代碼中找一下答案。

 

代碼比較長,我們重點關注下面的代碼
現在應該明白了吧,當我們傳進來的root不是null,並且第三個參數是false的時候,這個temp就被加入到了root中,並且把root當作最終的返回值返回了。而當我們設置root為空的時候,沒有設置LayoutParams參數的temp對象,作為返回值返回了。

因此,我們可以得出下面的結論:

1.若我們采用convertView = inflater.inflate(R.layout.item_list, null);方式填充視圖,item布局中的根視圖的layout_height屬性會被忽略掉,即所有的layout——xxx屬性都會被忽略掉然後設置成默認的包裹內容方式

2.如果我們想保證item的視圖中的參數不被改變,我們需要使用convertView = inflater.inflate(R.layout.item_list, parent,false);這種方式進行視圖的填充

3.除了使用這種方式,我們還可以設置item布局的根視圖為包裹內容,然後設置內部控件的高度等屬性,這樣就不會修改顯示方式了。

4.另外用convertView = inflater.inflate(R.layout.item_list,null),會有警告

 

這裡IDE會彈出warning:

Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout’s root element)

提示我們不要傳遞”null”作為root的參數,因為需要決定root節點的屬性。

在這裡,可以換用另一個inflate方法來避免這個warning:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        // 使用三個參數的inflate方法,設定root參數為getView中的parent參數,設定attachToRoot為false
        convertView = layoutInflater.inflate(R.layout.list_item, parent, false);
    }
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved