LayoutInflater工作
1. LayoutInflater的作用
把xml文件通过一系列复杂的解析过程转换成我们使用的View对象。
2. LayoutInflater的基本使用
View view = LayoutInflater.from(context).inflate(resourceId, parent, false);
可以看到LayoutInflater的使用分两步:
第一步
获取LayoutInflater的实例
LayoutInflater layoutInflater=LayoutInflater.from(context);
第二步
调用inflate()方法来加载布局
inflate(resourceId, parent, false)
里面有三个参数。
-
[ 第一个参数 ]
是我们要加载的xml文件的名字,通常是R.layout.banner_layout
这个样子。 -
[ 第二个参数 ]
就是我们指定的这个布局的父View。为什么要指定这个parent?假如我们要加载R.layout.banner_layout
布局文件。把它转换成view对象之后它该在哪里显示来让我们看到呢,就是这个parent。parent就是这个布局文件的父View。 -
[ 第三个参数 ]
是一个boolean值,false就是我不要把布局文件添加到parent中,true就是我要把布局文件添加到parent中。如果为false,那么必须要有一个parent.addView(view)
的操作我们才能看到布局文件的显示。
使用RecyclerView的适配器创建ViewHolder对象时
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.banner_layout, parent, false));
}
我们发现第三个参数为false,并且也没有使用parent.addView(view)
来把它加进parent中,但是它就是更够显示出来。这是因为在 LayoutInflater的源码中有一个parent.addView(view)
的操作。
3. 小结
inflate(int resource,ViewGroup root,boolean attachToRoot)的解析
1.如果root为null,attachToRoot将会失去作用,无意义。
2.如果root不为null,attachToRoot设为true.则会给加载的布局文件指定一个父布局,即root。
3.如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view中时,这些layout属性会自动失效。
4.在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
参考 https://blog.csdn.net/guolin_blog/article/details/121889703?spm=1001.2014.3001.5501