Android 基础之 LayoutInflater 总结

LayoutInflater 的获取

获取 LayoutInflater 的方式一般有三种:

  1. getLayoutInflater()
  2. LayoutInflater.from(Context context)
  3. context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

这三种获取方式本质上都是一样的

  • getLayoutInflater() 通过 getWindow().getLayoutInflater() 进行获取,getWindow() 获取的是 PhoneWindow,然后 PhoneWindow 通过 mLayoutInflater = LayoutInflater.from(context) 获取 LayoutInflater。

  • LayoutInflater.from(Context context) 内部通过以下代码获取 LayoutInflater。

    1
    2
    3
    4
    5
    6
    7
    8
    public static LayoutInflater from(Context context) {
    LayoutInflater LayoutInflater =
    (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (LayoutInflater == null) {
    throw new AssertionError("LayoutInflater not found.");
    }
    return LayoutInflater;
    }

结论:所以这三种方式最终都调用了 Context.getSystemService()

LayoutInflater 的 inflater 方法

inflater 作为 LayoutInflater 中最常用的方法,用于从 xml 的布局文件得到一个 View 对象,加载到 Activity 用于动态创建布局。inflater 总共重载了 4 种调用方式: 1. public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) 2. public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) 3. public View inflate(XmlPullParser parser, @Nullable ViewGroup root) 4. public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)

对于构造函数的使用而言,有如下注意事项:

  • root 填充的根视图
  • attachToRoot 决定是否将载入的视图附加到根视图上,如果为 false 则仅用于为 XML 中的根视图创建正确的 LayoutParams 的子类
  • 前三个 inflater 方法最终都会调用第四个 inflater 方法,采用了 pull 解析
  • 避免将 null 作为 ViewGroup 传入
  • 当不需要将返回的 View 添加入 ViewGroup 时应该设置attachToRoot 为 false
  • 避免在 View 已经被添加入 ViewGroup 时将 attachToRoot 设置为 True
  • 自定义 View 时非常适合将 attachToRoot 设置为 True

LayoutInflater 基本使用

由于 LayoutInflater 主要用于布局填充,所以主要涉及到的是 inflater 方法,inflater 返回了一个 View,其调用方式是:

1
2
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.first_fragment, container, false);

参考资料

  1. 深入理解 LayoutInflater.inflate()
  2. Android LayoutInflater 原理分析,带你一步步深入了解 View (一)
  3. LayoutInflater——80%的Android程序员对它并不了解甚至错误使用