带有膨胀的LinearLayout的意外的LayoutParams

gor*_*nwd 9 android android-layout layout-inflater

我有一个视图的XML定义,我将使用addChild添加到更大的容器视图中.它基于a 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"
>
Run Code Online (Sandbox Code Playgroud)

(省略剩余 - 可能不相关,因为它基本上按设计工作)

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

  1. 在我给视图充气后,getLayoutParameters()返回null.

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

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

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

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

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

Luk*_*rog 23

您没有提供一些重要的细节.

1)在我给视图充气后,getLayoutParameters()返回null.

我会假设你用过这个:

inflater.inflate(R.layout.content, null);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,LayoutInflater根本不能使(根本)适当LayoutParams的根,Linearlayout因为它不知道谁将成为它的父(因此它可以创建正确的类型LayoutParams).如果你愿意的话:

inflater.inflate(R.layout.content, someOtherLayout, false/true);
Run Code Online (Sandbox Code Playgroud)

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

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

我假设你谈论这个addView()方法.该addView()方法将检查LayoutParams试图添加的视图,如果是LayoutParams,null那么它将自动为该视图分配LayoutParams由其generateDefaultLayoutParams()方法返回的对象.

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

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

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

因为LayoutInflater照顾这个,因为ImageView它在布局的内部并且有一个已知的父母,从中LayoutInflater可以做出正确的LayoutParams.