Android-LayoutInflater.inflate

获得 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属性生效,只有这一个作用。

参考:

三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

android LayoutInflater.inflate()的参数及其用法

android—–LayoutInflater的inflate方法详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值