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

时间:2018-08-07 14:18:35

标签: android android-layout android-view layout-inflater

Android LayoutInflater到底是什么?打算使用什么方法?我可以找到不同类型的用法,但是找不到我所用的套件。



关于问题

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

1 个答案:

答案 0 :(得分:7)

什么是LayoutInflater?

LayoutInflater是一个类,用于从layout resource(xml)文件或文件的nodeXmlPullParser个对象)创建视图。

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


创建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)

根:是新创建的视图层次结构将附加到的ViewGroup。

attachToRoot::第一种和第三种方法将新创建的视图层次结构创建后附加到根。但是,如果选择通过ViewGroup#addView()手动添加它,或者应该在其他地方进行附加,则可以选择第二个或最后一个方法并将attachToRoot设置为false。
例如,在Fragment的{​​{1}}内部,以及在以onCreateView()的{​​{1}}创建视图时。您应该在这两个地方将RecyclerView设置为itemView,因为附加将在其他地方完成。如果我们将其设置为attachToRoot或在此类位置使用第一种或第三种方法,则会引发错误。

false


使用结果

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

理论上,所有这些方法都返回相同的内容-根视图。但是,对我们而言,它们并不相同。是吗?


一些常见错误

可以看出,即使已知,也将root设置为null。如果java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. attachToRoot,则root可以为null。但是,应尽可能给出它,因为它用于创建attachToRoot的正确子类。