手记

解释LayoutInflater的inflate方法.

第一次接触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是固定的, 也就是常量值, 那就不受影响, 可以正常工作.
0人推荐
随时随地看视频
慕课网APP