博客
关于我
Android-LayoutInflater.inflate
阅读量:234 次
发布时间:2019-02-28

本文共 2096 字,大约阅读时间需要 6 分钟。

获得 LayoutInflater 实例的三种方式

//获得 LayoutInflater 实例的三种方式://三种方式本质是相同的,最终本质是都是调用的Context.getSystemService()。        LayoutInflater inflater1 = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        LayoutInflater inflater2 = LayoutInflater.from(context);//Fragment可用        LayoutInflater inflater3 = getLayoutInflater();//Activity类下的方法

inflate方法参数介绍:

从android官方API中我们可以看到LayoutInflater共有四个inflate方法,最终都会调用

public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

inflate()的作用:就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。

第一个参数resource:需要加载布局文件的id,意思是需要将这个布局文件中加载到Activity中来操作。

第二个参数root:需要附加到resource资源文件的根控件,什么意思呢,就是inflate()会返回一个View对象,

如果第三个参数attachToRoot为true,就将这个root作为根对象返回,否则仅仅将这个root对象的LayoutParams属性附加到resource对象的根布局对象上,也就是布局文件resource的最外层的View上,比如是一个LinearLayout或者其它的Layout对象。即:true作为根对象,false仅提供LayoutParams。

第三个参数attachToRoot:是否将child添加到root上

1、如果root非空,并且attachToRoot为true的话,则会将当前子视图添加到父视图中;

attachToRoot为true 等同于 root.addView(child);

if (root != null && attachToRoot) {          root.addView(temp, params);}

如:

View childView = getLayoutInflater().inflate(R.layout.child, parentView);//有parentView,则第三个参数默认true/**或**/View childView = getLayoutInflater().inflate(R.layout.child, parentView, true);

2、如果root为空或者attachToRoot为false的话,则直接返回我们创建的temp.

if (root == null || !attachToRoot) {           result = temp;}

如:

View childView = getLayoutInflater().inflate(R.layout.child, null);/**或**/View childView = getLayoutInflater().inflate(R.layout.child, parentView,false);

attachToRoot为false的疑惑:

如果root不为null,而attachToRoot为false的话,表示不将第一个参数所指定的View添加到root中,有什么用呢?既然不添加到root中,那我第二个参数直接给null不就可以了?

其实不然,这里涉及到另外一个问题:我们在开发的过程中给控件所指定的layout_width和layout_height到底是什么意思?该属性的表示一个控件在容器中的大小,就是说这个控件必须在容器中,这个属性才有意义,否则无意义。
这就意味着如果我直接将child加载进来而不给它指定一个父布局,则inflate布局的根节点的layout_width和layout_height属性将会失效(因为这个时候child将不处于任何容器中,那么它的根节点的宽高自然会失效)。如果我想让child的根节点有效,又不想让其处于某一个容器中,那我就可以设置root不为null,而attachToRoot为false。这样,指定root的目的也就很明确了,即root会协助child的根节点生成布局参数,使layout_width和layout_height属性生效,只有这一个作用。

参考:

转载地址:http://mjss.baihongyu.com/

你可能感兴趣的文章
Mysql之性能优化--索引的使用
查看>>
mysql之旅【第一篇】
查看>>
Mysql之索引选择及优化
查看>>
mysql之联合查询UNION
查看>>
mysql之连接查询,多表连接
查看>>
mysql乱码
查看>>
Mysql事务。开启事务、脏读、不可重复读、幻读、隔离级别
查看>>
MySQL事务与锁详解
查看>>
MySQL事务原理以及MVCC详解
查看>>
MySQL事务及其特性与锁机制
查看>>
mysql事务理解
查看>>
MySQL事务详解结合MVCC机制的理解
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
mysql五补充部分:SQL逻辑查询语句执行顺序
查看>>
mysql交互式连接&非交互式连接
查看>>
MySQL什么情况下会导致索引失效
查看>>
Mysql什么时候建索引
查看>>
MySql从入门到精通
查看>>
MYSQL从入门到精通(一)
查看>>