什么是 LayoutInflater 以及如何正确使用它?

What is LayoutInflater and how do I use it properly?

Android 中的 LayoutInflater 到底是什么?使用它的预期方法是什么?我可以找到不同类型的用法,但无法找到适合我的情况。



关于问题

我对 inflate() 方法的正确用法有很多困惑。在互联网上进行研究时,大多数结果都是错误的或不完整的。甚至官方文档也很模糊。这个 post 是我在不同地方可以找到的内容的总结。相信对我这样的初学者会有帮助

什么是 LayoutInflater?

LayoutInflater is a class used to create views from a layout resource (xml) file or a node 个(XmlPullParser 个对象)。

这些可以是单个视图或视图层次结构的表示。


正在创建 LayoutInflater 对象

要膨胀视图,我们需要一个 LayoutInflater 对象。我们不是创建新对象,而是通常使用这些方法之一来获取具有上下文的现有对象。

第一个最常用,因为它简单。

以下是最后两种方法的示例用法。

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)
LayoutInflater inflater = (LayoutInflater)getSystemService(LayoutInflater.class)


增加浏览量

要膨胀视图,可以使用 LayoutInflater#inflate() 方法。它有四种形式,如下所列。如果源是布局资源,则可以使用前两种方法之一。如果源是布局资源节点,则使用最后两种方法。

  1. View inflate(int resource, ViewGroup root)

  2. View inflate(int resource, ViewGroup root, boolean attachToRoot)

  3. View inflate(XmlPullParser parser, ViewGroup root)

  4. View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)

root: 新创建的视图层级即将附加到的ViewGroup。

attachToRoot: 第一种和第三种方法在创建后将新创建的视图层次结构附加到根。但是,如果您选择通过 ViewGroup#addView() 手动添加它或者附加应该在其他地方进行,那么您可以选择第二种或最后一种方法并将 attachToRoot 设置为 false。
例如,在 FragmentonCreateView() 中以及创建视图时 RecyclerViewitemView。您应该在这两个地方将 attachToRoot 设置为 false,因为附加将在其他地方完成。如果我们设置成true或者在这种地方使用第一种或第三种方法,就会报错

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.


使用结果

如果attachToRoot为真,结果将是根视图。否则它将是新创建的视图层次结构。

理论上所有这些方法 returns 相同的东西 - 根视图。然而,对我们来说,它们并不相同。是吗?


一些常见错误

可见即使知道root也设置为null。如果 attachToRootfalse,根可以为空。但是,如果可能,应该给出它,因为它用于创建 LayoutParams.

的正确子类