什么是 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#from(Context context)
Activity#getLayoutInflater()
Context#getSystemService(Class<T> serviceClass)
Context#getSystemService(String name)
第一个最常用,因为它简单。
以下是最后两种方法的示例用法。
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)
LayoutInflater inflater = (LayoutInflater)getSystemService(LayoutInflater.class)
增加浏览量
要膨胀视图,可以使用 LayoutInflater#inflate()
方法。它有四种形式,如下所列。如果源是布局资源,则可以使用前两种方法之一。如果源是布局资源节点,则使用最后两种方法。
View inflate(int resource, ViewGroup root, boolean attachToRoot)
View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)
root: 新创建的视图层级即将附加到的ViewGroup。
attachToRoot: 第一种和第三种方法在创建后将新创建的视图层次结构附加到根。但是,如果您选择通过 ViewGroup#addView()
手动添加它或者附加应该在其他地方进行,那么您可以选择第二种或最后一种方法并将 attachToRoot
设置为 false。
例如,在 Fragment
的 onCreateView()
中以及创建视图时 RecyclerView
的 itemView
。您应该在这两个地方将 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。如果 attachToRoot
是 false
,根可以为空。但是,如果可能,应该给出它,因为它用于创建 LayoutParams
.
的正确子类
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#from(Context context)
Activity#getLayoutInflater()
Context#getSystemService(Class<T> serviceClass)
Context#getSystemService(String name)
第一个最常用,因为它简单。
以下是最后两种方法的示例用法。
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)
LayoutInflater inflater = (LayoutInflater)getSystemService(LayoutInflater.class)
增加浏览量
要膨胀视图,可以使用 LayoutInflater#inflate()
方法。它有四种形式,如下所列。如果源是布局资源,则可以使用前两种方法之一。如果源是布局资源节点,则使用最后两种方法。
View inflate(int resource, ViewGroup root, boolean attachToRoot)
View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)
root: 新创建的视图层级即将附加到的ViewGroup。
attachToRoot: 第一种和第三种方法在创建后将新创建的视图层次结构附加到根。但是,如果您选择通过 ViewGroup#addView()
手动添加它或者附加应该在其他地方进行,那么您可以选择第二种或最后一种方法并将 attachToRoot
设置为 false。
例如,在 Fragment
的 onCreateView()
中以及创建视图时 RecyclerView
的 itemView
。您应该在这两个地方将 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。如果 attachToRoot
是 false
,根可以为空。但是,如果可能,应该给出它,因为它用于创建 LayoutParams
.