天天看點

layoutinflater的三種inflate用法

LayoutInflater的用法總結

一、獲得LayoutInflater執行個體的3中方法

  • 通過activity中的getLayoutInflater();
  • 通過LayoutInflater.from(context);
  • 通過(LayoutInflater)getSystemService

    (Context.LAYOUT_INFLATER_SERVICE);

二、inflate參數的含義解析

大神詳細解析文章:http://blog.csdn.net/lmj623565791/article/details/38171465
inflate(int resource, ViewGroup root, boolean attachToRoot);
  • ==inflate(int resource,null);==

    是找到此xml布局檔案,傳回的就是此xml布局的view。不能正确的處理view其寬高,是因為是相對于父布局設定的寬高,但是root為null,故不能正确設定其view的寬高。

  • ==inflate(int resource,root,false)==

    将此xml布局添加到root中,也就是root作為其父布局,因為第三個參數attachToRoot為false,故隻把其父布局root的LayoutParamas參數傳遞,而不将xml布局添加到root中,傳回的就是一個帶有父布局LayoutParamas參數的xml布局的view。

  • ==inflate(int resource,root,true)==

    為true時當然就是把xml布局添加到root中,并且傳回root布局的view。

  • ==inflate(int resource,root)==

    檢視源碼可知:

public View inflate(int resource, ViewGroup root) {
        return inflate(resource, root, root != null);
    }
           

其實他使用的就是inflate三個參數的方法,當root=null時,和第一種方法一樣,root!=null時,和第三種的true時一樣。

==注意==:

- listview中,我們重寫擴充卡的getview方法時,inflate(resourceID,root,attachToRoot),其中attachToRoot不能為true(因為系統已經幫我們加到父布局了),否則會報錯。

一般使用inflater.inflate(R.layout.fragment1, null);
- ::: E/AndroidRuntime(): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
           
  • fragment的oncreateView中的inflate也不能為true
一般使用inflater.inflate(R.layout.fragment1, container,false);