LayoutInflate用法和解析

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;

6、参考博客

http://blog.csdn.net/lmj623565791/article/details/38171465

http://www.cnblogs.com/top5/archive/2012/05/04/2482328.html

你可能感兴趣的:(LayoutInflate用法和解析)