【问题标题】:Unexpected LayoutParams with an inflated LinearLayout带有膨胀 LinearLayout 的意外 LayoutParams
【发布时间】:2012-12-09 08:38:19
【问题描述】:

我有一个视图的 XML 定义,我使用 addChild 添加到更大的容器视图中。它基于LinearLayout,看起来基本上是这样的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="52dip"
android:background="@drawable/box_bg"
android:clickable="true"
android:onClick="onTreeBoxClick"
android:orientation="horizontal" >

<ImageView android:id="@+id/box_photo"
    android:layout_width="45dip"
    android:layout_height="45dip"
        ...
/>
<RelativeLayout
    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="wrap_content"
>

(省略其余部分——可能不相关,因为它基本上按设计工作)

当我创建这些视图时,我发现以下对我来说很奇怪的行为:

  1. 在我为视图膨胀后,getLayoutParameters() 返回 null。

  2. 调用 addChild() 将其添加到其父对象后,getLayoutParameters() 返回一个有效对象。

  3. 检查 LayoutParameters,我发现宽度和高度都设置为 -2 (WRAP_CONTENT),这显然不是我在 XML 文件中指定的值。

  4. 当我查看随附的 ImageView 的布局参数时,它会读取指定的值。

谁能解释这里发生了什么?为什么没有注意到我指定的高度?

这并没有真正影响到我,因为父视图是一个自定义视图,其中我使用 MeasureSpec 等强制子级的最终尺寸,但无论如何我想了解这一点!

【问题讨论】:

    标签: android android-layout layout-inflater


    【解决方案1】:

    你没有提供一些重要的细节。

    1) 在我对视图进行膨胀之后,getLayoutParameters() 返回 null。

    我假设你使用了这个:

    inflater.inflate(R.layout.content, null);
    

    在这种情况下,LayoutInflater 不能(根本)为根 LayoutParams 生成正确的 Linearlayout,因为它不知道谁将成为它的父级(因此它可以创建正确类型的LayoutParams)。如果你会使用这个:

    inflater.inflate(R.layout.content, someOtherLayout, false/true);
    

    然后根LinearLayout 将具有正确的LayoutParams,因为它将看到someOtherLayout 的类型并根据此信息创建LayoutParams。如果这不是您当前所做的,您可能需要提供一段代码以获得更好的答案。

    2) 在我调用 addChild() 将其添加到其父级后, getLayoutParameters() 返回一个有效的对象。

    我假设您谈论的是addView() 方法。 addView() 方法将检查正在尝试添加的视图的 LayoutParams,如果这些 LayoutParamsnull,那么它将自动为该视图分配一个由其 generateDefaultLayoutParams() 方法返回的 LayoutParams 对象。

    3) 检查 LayoutParameters,我发现宽度和高度都设置为 -2 (WRAP_CONTENT),这显然不是我在 XML 文件中指定的。

    正如我在 2 中所说,生成的 LayoutParams 来自 generateDefaultLayoutParams() 方法,该方法将返回一个 LayoutParams 实例,就像父级设计的那样。例如,方向为HORIZONTAL(默认)的LinearLayout 将返回宽度/高度设置为WRAP_CONTENTLayoutParams 实例。

    4) 当我查看附带的 ImageView 的布局参数时,它 读取指定值。

    因为LayoutInflater 处理了这一点,因为ImageView 它位于布局的内部,并且有一个已知的父级,LayoutInflater 可以从中生成正确的LayoutParams

    【讨论】:

    • 谢谢。我最终弄清楚了这是如何工作的。我所做的修复它是使用 addView() 的第三个参数来为要添加的视图指定所需的 LayoutParams。 (是的,我在我的 OP 中将 addView 错误地输入为 addChild,考虑到我在自定义视图类中调用的 getChild() 的逆操作。:-))
    • 使用parent进行inflating时,第三个参数应该使用false。 true 对我不起作用,params 仍然是错误的。总之,做inflater.inflate(R.layout.content, someOtherLayout, false);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多