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

Ber*_*yle 3 android android-layout layout-inflater android-view

LayoutInflaterAndroid中到底是什么?使用它的目的方法是什么?我可以找到不同类型的用法,但在我的情况下无法找到哪一个套件.



关于这个问题

关于正确使用该inflate()方法,我有很多困惑.在互联网上进行研究时,大多数结果都是错误的或不完整的.即使是官方文件也很模糊.这篇文章是我在不同地方可以找到的内容的总结.我相信这对像我这样的初学者会有所帮助

Ber*_*yle 10

什么是LayoutInflater?

LayoutInflater是一个用于从布局资源(xml)文件或其节点(XmlPullParser对象)创建视图的类.

这些可以表示单个视图或视图层次结构.


创建LayoutInflater对象

要给视图充气,我们需要一个LayoutInflater对象.我们通常使用其中一种方法来获取具有上下文的现有对象,而不是创建新对象.

第一个是最常用的,因为它简单.

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

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)
LayoutInflater inflater = (LayoutInflater)getSystemService(LayoutInflater.class)
Run Code Online (Sandbox Code Playgroud)


膨胀意见

要扩大视图,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,新创建的视图层次结构将附加到该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.
Run Code Online (Sandbox Code Playgroud)


使用结果

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

从理论上讲,所有这些方法都返回相同的东西 - 根视图.但是,对我们来说,它们并不相同.是吗?


一些常见的错误

可以看出,即使已知root,也将其设置为null.如果attachToRoot是,则root可以为null false.但是,应该尽可能给它,因为它用于创建正确的子类LayoutParams.

  • 为什么它被称为充气机,为什么不称为创造者(例如)。为什么是这个词? (2认同)
  • @JohnnyFive 这是因为在创建后,它会将新创建的视图附加(填充/膨胀)到其父级中可用的位置,因为它是最常用的表单(在其他表单中,可以通过将 attachToRoot 作为错误的) (2认同)