概述
LayoutInflater.inflate()这个方法主要起到的是填充布局的作用,常用于给fragment添加布局文件,或是在RecyclerView的adapter中给RecyclerView填充item样式。此方法主要分两个参数和三个参数的形式:
public View inflate(int resource, @Nullable ViewGroup root)
public View inflate(int resource, @Nullable ViewGroup root, boolean attachToRoot)
参数解释
resource:此参数代表要填充进去的布局文件
root:根节点布局参数,参考官方文档解释(Optional view to be the parent of the generated hierarchy. This value may be null.)
attachToRoot:resource所表示的布局是否添加到root所表示的view上,如果值为false,则root仅用于为XML中的根视图创建LayoutParams的正确子类。
使用解析
只使用两个参数的情况
1.root为null时,此时表示不需要将resource布局添加到任何一个root view中,且也没有任何root view来协助resource布局文件确定自身的布局位置。此时resource布局文件最外层的layout_width和layout_height等跟父布局有关的位置属性都会失效!!且inflate方法返回的是根据resource布局所代表的view!!
2.root不为null时,此时效果等同于inflate(int resource, @Nullable ViewGroup root, boolean true),即把resource布局添加到root view中。
使用三个参数的情况
PS:若第二个root参数为null,则设置和不设置第三个参数都无效,故只讨论以下两种情况:
1.inflate(int resource, @Nullable ViewGroup root, boolean true):此时表示把resource布局文件添加到第二个参数root view中(方法内部会直接调用root.addView方法),且inflate方法返回的是root所代表的view!!
2.inflate(int resource, @Nullable ViewGroup root, boolean false):此时不会把resource布局添加到root中,但是会用root节点协助resource布局确定自身的位置。注意此时resource布局文件最外层的layout_width和layout_height等属性只有当该view被添加到另外一个view中时才会生效。这种情况下inflate方法返回的是返回的是resource布局所代表的view!!
延申一下
两个参数的inflate方法源码
public View inflate(XmlPullParser parser, @Nullable ViewGroup root) {
return inflate(parser, root, root != null);
}
可以看到两个参数的方法里面也是调用的三个参数的方法,不仅如此,inflate的四个重载方法最终都会调用到inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 方法。
为什么Activity布局文件(如activity_main)的宽高属性能生效?
因为我们的Activity页面都有一个父view叫DecorView,DecorView中包含标题栏(ActionBar)和内容展示页(ContentView),我们setContentView(R.layout.activity_main)时都是把布局设置到了这个ContentView中,所以Activity布局文件其实是有父布局的,故它的宽高等属性能生效。附上view的层级结构图如下: