使用layoutinflater的正确姿势

本文详细探讨了Android中LayoutInflater的使用,包括如何添加View到ViewGroup,LayoutInflater的工作原理,特别是inflate函数的resource、attachToRoot和root参数的含义。理解attachToRoot参数是掌握LayoutInflater的关键,它决定了是否将生成的View添加到root ViewGroup以及返回值。同时,文章强调了正确的使用方式,根据是否需要将生成的View添加到root ViewGroup来选择不同的inflate方法。
摘要由CSDN通过智能技术生成

使用layoutinflater的正确姿势

    一开始接触安卓开发的时候,知道layoutinflater是用来将布局文件生成对应的View.那时候还是懵懵懂懂知道需要传递一个layoutId一个parent参数和一个false参数.那时候就这样用,初初还是好好的.直到后来随着进一步学习安卓开发发现layoutinflater的这两个参数是有大大的门道在里面.
    然后这一篇博客可以说是我对layoutinflater使用的一个总结.


怎么添加一个View到ViewGroup?

    在讨论怎么使用layoutinflater之前,我们先来想这个有趣的问题.对于一个View我们是怎么添加到ViewGroup的?

分别有两种办法(归根到底还是一种而已,事实上以上第一种方法总归还是通过第二种办法实现的)
  • 在编写布局文件的时候View作为ViewGroup的子节点

  • 通过调用ViewGroup的addView系列方法添加View

这里写图片描述

    我们关注紫色框圈起来的两个addView方法.这两个方法区别就是是否传递LayoutParam参数.为什么要传递这个参数?为什么又可以不彻底?

    很好理解嘛,不传递那么我就默认帮你构造一个就完事了.

这里写图片描述

    看到代码其实如不使用addView(View child)给一个ViewGroup添加View.需要添加的View自带了LayoutParam那么在添加的过程中我就取出来并且拿来使用,如果View是没有附上LayoutParam那么我就帮你构造一个ViewGroup.Layout.

这里写图片描述

这里写图片描述

    这里要注意一个很严峻的问题.在ViewGroup的代码里面使用generateDefaultLayoutParams函数生成一个ViewGroup.LayoutParam对象.
    但是你换成ViewGroup的子类LinearLayout(当然其他子类也可以,这里拿LinearLayout作为讲解).你会发现generateDefaultLayoutParams函数重写了!并且不是生成ViewGroup.LayoutParam对象而是LinearLayout.LayouParam对象了!

    这样绕了一圈我到底想表达什么?我是想让你知道.一个View添加到ViewGroup是必须要使用对应的LayoutParam.

    可以做一个小测试..给LinearLayout添加一个内部持有ViewGroup.LayoutParam对象的View.

    看看LinearLayout的部分代码片段,LinearLayout会把自己包含的子View拿出来.并且拿到子View的LayoutParam强转为LineLayout.LayoutParam并且使用里面相应的属性.

LineLayout.LayoutParam继承ViewGroup.MarginLayoutParams
Vie
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值