Android UI 詳解之LayoutInflater
1、LayoutInflater
LayoutInflater作用是將layout的xml佈局文件實例化爲View類對象。
2、LayoutInflater實例化方法有以下3種
LayoutInflater
inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View
layout = inflater.inflate(R.layout.main,
null
);
LayoutInflater
inflater = LayoutInflater.from(context);
View
layout = inflater.inflate(R.layout.main,
null
);
LayoutInflater
inflater = getLayoutInflater();(在Activity中可以使用,實際上是View子類下window的一個函數)
View
layout = inflater.inflate(R.layout.main,
null
);
3、下面看一個例子
public class MyInflate extends Activity{
private TextView tv;
public void OnCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
//tv = (TextView) findViewById(R.id.tv);
LayoutInflater inflate = LayoutInflater.from(this);
View view = inflate.inflate(R.layout.main,null);
setContentView(view);
}
}
所以我們能瞭解setContentView和inflate的區別
setContentView可以傳遞一個resourceId也可傳遞View對象,如果傳遞resourceId,也是先實例一個View並顯示,
如果穿的view就直接顯示,而inflate就只是加載實例一個view對象,並不顯示,所以如果在非activity中控制佈局設置操作就只能用inflate。
4、android上還有一個與Inflate()類似功能的方法叫findViewById(),二者有時均可使用,但也有區別
inflate是用來找layout下佈局文件,並實例化;而findViewById是找佈局文件下的具體widget。
5、詳細剖析一下setContentView
當我們運行程序的時候,有一個setContentView()方法,Activity其實不是顯示視圖(直觀上感覺是它),實際上Activity調用了PhoneWindow的setContentView()方法,然後加載視圖,將視圖放到這個Window上,而Activity其實構造的時候初始化的是Window(PhoneWindow),Activity其實是個控制單元,即可視的人機交互界面。
打個比喻:
Activity是一個工人,它來控制Window;Window是一面顯示屏,用來顯示信息;View就是要顯示在顯示屏上的信息,這些View都是層層重疊在一起(通過infalte()和addView())放到Window顯示屏上的。而LayoutInfalter就是用來生成View的一個工具,XML佈局文件就是用來生成View的原料
getWindow().setContentView(layoutResID);
initActionBar();
}
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mLayoutInflater.inflate(layoutResID, mContentParent);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}