標籤:
LayoutInflater一定不會陌生,都會知道它主要是用於載入布局的
因為載入布局的任務通常都是在Activity中調用setContentView()
setContentView()方法 的內部就是用LayoutInflater實現的。、只不過這部分源碼是internal的,不太容易查看到
1、擷取到LayoutInflater的執行個體
法1、
LayoutInflater layoutInflater = LayoutInflater.from(context);
法2、
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
其實第一種就是第二種的簡單寫法,只是Android給我們做了一下封裝而已。得到了LayoutInflater的執行個體之後就可以調用它的inflate()方法來載入布局了,
layoutInflater.inflate(resourceId, root);
inflate()方法一般接收兩個參數,
第一個參數就是要載入的布局id
第二個參數是指給該布局的外部再嵌套一層父布局,如果不需要就直接傳null。這樣就成功成功建立了一個布局的執行個體,之後再將它添加到指定的位置就可以顯示出來了。
mainLayout.addView(buttonLayout);
LayoutInflater技術廣泛應用於需要動態添加View的時候,比如在ScrollView和ListView中,經常都可以看到LayoutInflater的身影。
LayoutInflater其實就是使用Android提供的pull解析方式來解析布局檔案的。
createViewFromTag()這個方法,並把節點名和參數傳了進去。看到這個方法名,我們就應該能猜到,它是用於根據節點名來建立View對象的。確實如此,在createViewFromTag()方法的內部又會去調用createView()方法,然後使用反射的方式建立出View的執行個體並返回。
LinearLayout的父布局確實是一個FrameLayout,而這個FrameLayout就是由系統自動幫我們添加上的。
我們調用setContentView()方法時所傳入的布局其實就是放到這個FrameLayout中的,這也是為什麼這個方法名叫作setContentView(),而不是叫setView()。
Android--自訂控制項(一) LayoutInflater