首先解释一下infalter的英语意思:填充,膨胀
LayoutInfalter通常用来来findViewbyId来对比,两者的差别是:
1.不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;
2.findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
这里比较难以理解的是什么时候界面载入过,什么时候页面没有载入过,从网上有一篇文章是这样理解的:
什么是已经被载入的layout,什么是还没有载入的.我们启动一个应用,与入口Activity相关的layout{常见的是main.xml}就是被载入的,即在Oncreate()中的.而其他的layout是没有被载入的.就要动态载入了或通过另一个activity.(其实我个人觉得这里其实没法说明本质的原因),另外一篇博文中描述的更清楚:
(http://www.open-open.com/lib/view/open1328837587484.html)
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()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象,有需要时再用setContentView(view)显示出来。一般在activity中通过setContentView()将界面显示出来,但是如果在非activity中如何对控件布局设置操作了,这就需要LayoutInflater动态加载。
个人理解为:setContentView里面一般就会加载界面,如果有方法加载过界面,那直接可以通过findViewById来取得相关控件,而在非activity中,是没有setContentView来加载界面,所以我们就需要使用LayoutInflater了。
LayoutInflater用法:
LayoutInflater的作用是,把一个View的对象与XML布局文件关联并实例化。
-
View的对象实例化之后,可以通过findViewById()查找布局文件中的指定Id的组件。
比如上篇文章中的list_item我们可以通过LayoutInflater关联到list_item,并实例化这个View,然后我们可以通过 findViewById来取得里面的title,content;
LayoutInflater三种使用方法:
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);