LayoutInflate
一、是什么?
LayoutInflate就是传说中的布局泵,是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
二、实例化方法
LayoutInflater 实例的三种方式:
1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater()
2. LayoutInflater inflater = LayoutInflater.from(context);
3. LayoutInflater inflater = (LayoutInflater)context.getSystemService
另外getSystemService()是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。所以,必须在activity的上下文环境下才能使用布局泵,不是想在哪里用就可以用的·;
三、加载布局 inflate(int resource, ViewGroup root,boolean attachToRoot);
1、 Inflate(resId , null )不能正确处理宽和高是因为:layout_width,layout_height是相对了父级设置的,必须与父级的LayoutParams一致。而加载的view的getLayoutParams为null,不正常显示,源码分析主要是没有设置setLayoutParams(params);
2、Inflate(resId , parent,false)加载的view 可以正确处理,因为加载的view设置了setLayoutParams(params);这个params正是父类布局generateLayoutParams(attrs);得到的,正常显示,原来参数设成什么就是什么
3、Inflate(resId , parent,true )不仅不能够正确的处理,并且返回的是parent,和以上两者返回值有绝对的区别;
4、部分源码解析
1、默认返回的view 为 View result=root;root为传进去的root;
2、如果root为true 且attachToRoot则temp.setLayoutParams(params);
if(root!=null) {
params=root.generateLayoutParams(attrs);
if(!attachToRoot) {
temp.setLayoutParams(params);
}
3、
final View temp= createViewFromTag(root,name,attrs,false); 从xml解析出来的view,及我们要显示的view
4、如果root为null或者attachToRoot为false,则返回的view 就是我们要显示的view而不是父类view root
// Decide whether to return the root that was passed in or the
// top view found in xml.
if(root==null|| !attachToRoot) {
result=temp;
}
5、总结
使用 inflate(int resource, ViewGroup root,boolean attachToRoot);,一看父类root是谁,而看attachToRoot是否为true,如果要显示的布局为 FrameLayout->button,传入的root为FrameLayout,则返回的就是这个FrameLayout;
网友评论