Android LayoutInflater
到底是什么?打算使用什么方法?我可以找到不同类型的用法,但是找不到我所用的套件。
关于问题
我对inflate()
方法的正确用法有很多困惑。在互联网上进行调查时,大多数结果是错误的或不完整的。甚至官方文档也很模糊。这篇文章是我在不同地方可以找到的总结。我相信这将对像我这样的初学者有所帮助
答案 0 :(得分:7)
LayoutInflater
是一个类,用于从layout resource(xml)文件或文件的node(XmlPullParser
个对象)创建视图。
这些可以表示单个视图或视图层次结构。
要使视图膨胀,我们需要一个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)
根:是新创建的视图层次结构将附加到的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
的正确子类。