Android 调整父对象的大小以匹配其子对象

Android 调整父对象的大小以匹配其子对象,android,view,android-framelayout,viewgroup,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"

我有一个复杂的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>

...
--更新2-- 我在下面添加了两张图片来演示正在发生的事情和应该发生的事情:

错误:


正确:

如果您详细说明您试图在版面中完成的内容(不是版面本身,而是用户在屏幕上看到的内容以及版面中的其他元素),则If将有所帮助

具有多个子项的框架布局通常是“代码气味”。通常,框架布局应该只有一个子元素。所以我想知道你的设计是否有问题

--编辑--

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

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

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

  • 您已将framelayout width设置为与父级匹配,但希望包装图像的内容

  • 您希望减少imageView,但没有考虑线性布局中的文本视图。您已将它们设置为包装内容。因此,当fame布局很小时,您将无法看到所有的文本视图。(除非您以某种方式调整它们的大小)

  • 很抱歉,如果这不够有用,但很难理解您试图用此布局实现什么。一个示例用例将有助于为您提供更好的建议。

    当尺寸(宽度/高度)为
    measurespect时,确切地说
    adjustViewBounds不会影响它

    在您的情况下,使用android:width=“match_parent”可以确保图像视图的大小与父视图的大小相同,而不考虑adjustViewBounds

    它首先起作用,因为高度是
    wrap\u content
    ——当缩放图像以填充宽度时,高度会进行调整

    当您覆盖高度以适应屏幕上的所有内容时(一开始这可能不是一个好主意),宽度仍然与父对象匹配,不会进行调整。但是,由于缩放类型为
    ScaleType.FIT\u 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" />
    
    
    

    即使这样做有效,您也可能无法在使用权重的水平线性布局中使用它(例如,如果您需要布局的横向变化),或者在许多其他场景中使用它。

    Hi Mike。我补充了更多关于我问题背后原因的信息。谢谢你的帮助。你好,迈克。谢谢你抽出时间来帮助我。我附上了两个例子,说明正在发生的事情以及应该如何发生。请让我知道我需要从我的来源解释或粘贴什么。如果没有某种类型的裁剪,你不能同时保持纵横比和匹配父对象的大小。您是否尝试过删除adjustViewBounds和setting scaleType?是的,我尝试过删除adjustViewBounds和setting scaleType=“centerInside”,但它没有改变布局中的任何内容(结果是相同的)。让我测试一下,然后返回给您adjustViewBounds不会影响图像视图的匹配父维度。当您手动降低高度时,在使用默认比例类型(FIT_CENTER)绘制图像时,图像的大小正在调整,但视图的宽度仍然相同。很抱歉,我不清楚“在其上”是什么意思。你的意思是“在顶部分层”(如z顺序)还是“朝向屏幕顶部”(如y坐标)?@FunkTheMonk adjustViewBounds用于保持图像的纵横比,不是吗?不过,我想在这种情况下没有必要这样做。@MikeT对此我很抱歉;英语不是我的主要语言。我的意思是在顶部分层,就像在z轴上一样。:)
    <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" />