Android 基础之 LayoutInflater 总结
LayoutInflater 的获取
获取 LayoutInflater 的方式一般有三种:
- getLayoutInflater()
- LayoutInflater.from(Context context)
- 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
8public 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 | LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
参考资料
- 深入理解 LayoutInflater.inflate()
- Android LayoutInflater 原理分析,带你一步步深入了解 View (一)
- LayoutInflater——80%的Android程序员对它并不了解甚至错误使用