调整父级的大小以匹配其子级

时间:2014-07-30 15:09:04

标签: android view android-framelayout viewgroup

我有一个复杂的xml布局,其中一部分是:

...

<FrameLayout
        android:id="@+id/parent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:layout_weight="1" >

        <ImageView
            android:id="@+id/flexible_imageview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:adjustViewBounds="true" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="@drawable/gradient"
            android:orientation="vertical"
            android:paddingBottom="16dp"
            android:paddingLeft="16dp"
            android:paddingTop="8dp" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
</FrameLayout>

...

FrameLayout @+id/parent的高度必须在运行时确定,因为它显示在许多其他视图上方,并且必须在布局中显示。这样,FrameLayout可以完美地填充剩余空间(使用height =&#34; 0dp&#34;以及weight =&#34; 1&#34;属性)。

ImageView @+id/flexible_imageview从网络接收图像,并始终以正确的宽高比显示。这部分也已经可以了。此视图是最大的,应确定FrameLayout @+id/parent的大小。

问题在于,在绘制图像时,FrameLayout @+id/parent的宽度不会被调整为包裹并且应该是ImageView @+id/flexible_imageview

感谢任何帮助。

- 更新 -

我更新了布局,以澄清一些缺失的部分,并在所有部分后面添加推理。

我想要的是拥有一个未知尺寸的图像(ImageView @+id/flexible_imageview),在它上面有一个渐变和一些文本在渐变的顶部。我无法将FrameLayout @+id/parent尺寸设置为wrap_content,因为此图像后面必须显示更多视图。如果布局中没有足够的空间,则图像(ImageView @+id/flexible_imageview)将减少,直到它完全适合布局,但它应保持其纵横比,并在其上保持渐变/文本。

@ drawable / gradient只是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <gradient
        android:angle="270"
        android:endColor="#aa000000"
        android:startColor="#00000000" />
</shape>

- 更新2 -

我在下面添加了两张图片来展示发生了什么,以及会发生什么:

错误:Bug

正确:Correct

2 个答案:

答案 0 :(得分:0)

如果您在布局中更多地了解了您要完成的任务(而不是布局本身,但用户应该在屏幕上看到什么以及布局中的其他元素是什么),那将有所帮助。

具有多个孩子的FrameLayout通常是&#34;代码气味&#34;。通常,FrameLayouts应该只有一个子元素。所以这让我想知道你的设计是否有问题。

- 编辑 -

如果我理解正确,您正在尝试使用framelayout来包装图像的内容,但同时在帧布局之前/之后匹配其他布局视图中剩余的空间。

框架布局的父视图/布局是什么?

我发现这个设计或你的解释存在一些问题:

  1. 您将framelayout宽度设置为与父级匹配,但您想要包装图像的内容。

  2. 您希望缩小imageView,但不考虑线性布局中的文本视图。您已将它们设置为包装内容。因此,当名气布局很小时,您将看不到所有的文本视图。 (除非你以某种方式调整它们的大小)。

  3. 很抱歉,如果这不够有用,但很难理解您要使用此布局完成的工作。一个示例用例将有助于为您提供更好的推荐。

答案 1 :(得分:0)

当尺寸(宽度/高度)为MeasureSpec.EXACTLY时,adjustViewBounds不会影响它。

在您的情况下,android:width="match_parent"确保图片视图的大小与父级一样,无论adjustViewBounds如何。

它的工作原理是因为高度为wrap_content - 在缩放图像以填充宽度时调整高度。

当你覆盖高度以适应屏幕上的所有内容时(这可能不是一个好主意),宽度仍然与父级匹配,并且不会被调整。但是,因为缩放类型为ScaleType.FIT_CENTER,所以缩放并定位图像,使其整体适合ImageView的边界(并居中...因此名称)。

如果您打开绘制布局边界的调试选项,或使用hierarchyviewer查看您的应用程序,您将看到图像视图仍然与其父级的宽度匹配。

有几种方法可以做你想做的事。 由于您已经手动计算了高度,因此设置宽度不应该那么难。

Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable.getIntrinsicWidth() > 0 && drawable.getIntrinsicHeight() > 0) {
    int height = // however you calculate it
    int width = height / (getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth());
}

你可能也会离开

<ImageView
    android:id="@+id/flexible_imageview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    android:minWidth="9999dp" />

即使这样可行,您可能无法再使用权重在水平LinearLayout中使用它(例如,如果您想要布局的横向变体),或许多其他场景。