【问题标题】:What is LayoutInflater and how do I use it properly?什么是 LayoutInflater 以及如何正确使用它?
【发布时间】:2018-08-07 14:18:34
【问题描述】:

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



关于问题

我对@9​​87654322@ 方法的正确使用有很多困惑。在互联网上进行研究时,大多数结果要么是错误的,要么是不完整的。甚至官方文档也很模糊。这篇文章是我在不同地方可以找到的总结。我相信这对像我这样的初学者会有帮助

【问题讨论】:

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


    【解决方案1】:

    什么是 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)

    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 为真,则结果将是根视图。否则它将是新创建的视图层次结构。

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


    一些常见错误

    可以看出,即使知道root,也将root设置为null。如果attachToRootfalse,则根可以为空。但是,如果可能,应该给出它,因为它用于创建LayoutParams 的正确子类。

    【讨论】:

    • 为什么叫inflator,为什么不叫creator(例如)。为什么是这个词?
    • @JohnnyFive 这是因为在创建后,它会将新创建的视图附加(填充/膨胀)到其父级中可用的位置,当它作为最常用的表单使用时(在其他表单中,此默认行为可以通过将 attachToRoot 传递为 false 来更改它)
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    相关资源
    最近更新 更多