博客
关于我
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中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>
MySql中的concat()相关函数
查看>>
mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
查看>>
MySQL中的count函数
查看>>
MySQL中的DB、DBMS、SQL
查看>>
MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
查看>>
MySQL中的GROUP_CONCAT()函数详解与实战应用
查看>>
MySQL中的IO问题分析与优化
查看>>
MySQL中的ON DUPLICATE KEY UPDATE详解与应用
查看>>
mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
查看>>
mysql中的undo log、redo log 、binlog大致概要
查看>>