在Android API<上,XML Drawable未扩展为View大小,或View未正确继承其父级的高度11

时间:2013-04-03 07:03:25

标签: android android-layout xml-drawable

考虑以下布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg1" >

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/bg2" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <!-- some views here -->
    </LinearLayout>
</FrameLayout>

我正在使用bg2 bg1,而bg2仍然完全独立,这样我就可以申请一个补间动画的alpha动画,不会影响其他任何内容。

bg1bg2是XML drawable。显然,它们应该按照各自的View尺寸进行缩放。通常就是这种情况,明确指定其尺寸似乎没有多大意义。

不幸的是,在3 / API 11之前的Android版本上,看起来好像bg2的大小为零。也许两阶段布局测量是错误的(请注意bg2如何从其父级继承其高度,而父级又需要调整到LinearLayout的高度并将该信息传播到视图包含bg2)。或者View可能不会接受其父级的高度(虽然我尝试ImageView没有改变任何东西)。

您看到的布局实际上用于列表中的项目。

XML drawables是有状态的并且使用渐变。

你能想到一种适用于Android API 8到10的方法吗?

1 个答案:

答案 0 :(得分:3)

一些测试(子类化View,覆盖onMeasure()onLayout())表明在较旧的Android版本中,FrameLayout在这方面已被打破。

由于FrameLayout无法在此方案中向层次结构中传递自己的高度(View始终会0同时显示onMeasure()onLayout())没有明显的方法可以通过子类来解决这个问题。

接下来的问题是,是否有另一种方法来覆盖Android 2.2 aka API 8可以正确处理的两个视图。

唉,有。使用RelativeLayout可以实现同样的效果,当然,这需要更多的开销,尽管渲染工作的实际增加应该是有限的。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg1" >
    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignTop="@+id/item"
        android:layout_alignBottom="@+id/item"
        android:background="@drawable/bg2" />
    <LinearLayout
        android:id="@+id/item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    </LinearLayout>
</RelativeLayout>