第一次接触inflate方法是在使用ListView的getView()时. 当时只知道这么写, 并不知道为什么.
LayoutInflate.from(getContext()).inflate(ID, parent, false);
想写一下为什么这么写的原因, 希望能帮到Android道路上的新手(如果有iOS和Android的问题, 欢迎加好友一起讨论).
这个inflate方法有四个重载, 分别是:
// A
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root)
// B
public View inflate(XmlPullParser parser, @Nullable ViewGroup root)
// C
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
// D
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)
首先先说说形参的意义.
- resource : 它是要解析的XML文件的ID号(必填)
- root : 也就是ListView本身
- 如果传入不为空, attachToRoot也为true, 就把XML解析后的view加入root子控件, 然后返回这个root.
- 否则, 就返回一个解析之后的XML生成的view.
- attachToRoot : 决定是否让root成为返回值的父控件
- parser : XML的解析器
这四个方法的关系如下, 这样就很清晰了, 最终都会去调用D方法. 由D方法负责去解析XML
- 调用A之后, A内部调用C, 并将attachToRoot设置为true, C内部调用D.
- 调用
B之后, B内部调用D, 并将attachToRoot设置为true - 调用C之后, C内部调用D
为什么要像下面这么写来返回View?
LayoutInflate.from(getContext()).inflate(ID, parent, false);
- 省略attachToRoot, 其他不变行不行? 不行. 因为这在执行时会默认传入true. 由上面的解释可以知道, 这样会返回那个root, 也就是返回了整个ListView, 这个ListView再被当做getView()方法返回传入ListView, 会直接报错.
- 将attachToRoot传入true, 其他不变行不行? 不行. 上面的后半段解释过了
- 将root传入null, 其他不变行不行? 分情况:
- ListView的cell的布局文件中的UI控件的Layout_XX全部依赖最外层控件, 那就有影响了, 此时最外层的Layout_XX属性失效, 使用ListView的默认属性.
- ListView的cell的布局文件中的UI控件的Layout_XX是固定的, 也就是常量值, 那就不受影响, 可以正常工作.
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦