ImageView:adjustViewBounds不适用于layout_height =“fill_parent”?

我试图放置单行EditText左侧的ImageView 。 但我无法正确缩放图像以匹配文本input的高度。

布局很简单:

  <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:adjustViewBounds="true" android:scaleType="fitStart" android:background="#f00" android:src="@drawable/icon" /> <EditText android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

(我用红色突出显示图像背景以查看由ImageView分配的实际空间)


如果我指定了ImageView的确切高度:

  android:layout_height="48dp" 

那么我得到我所需要的最接近的观点: 在这里输入图像说明

但是我不知道EditText的确切高度,所以我无法在这里为ImageView指定它。


当指定ImageView的高度来填充它的父级(以匹配EditText的高度)时:

  android:layout_height="fill_parent" 

那么我会在图像和文本input之间得到意想不到的额外余量: 在这里输入图像说明

实际上,在这种情况下, ImageView宽度等于未缩放的图像宽度,而图像被缩放。


如果将layout_height指定为48dp并将adjustViewBounds设置为false48dp与以下显示的图片类似:

  android:layout_height="48dp" android:adjustViewBounds="false" 

在这里输入图像说明


所以,这里的问题是:如何正确定义布局来缩放图像以匹配编辑条目高度,同时要将ImageView宽度缩小到缩放的图像宽度? 换句话说,如何摆脱这个额外的空间?

Solutions Collecting From Web of "ImageView:adjustViewBounds不适用于layout_height =“fill_parent”?"

这是一个LinearLayout错误。 如果你在这里看源码forceUniformHeight 。 你可以看到,当LinearLayout被设置为wrap_content时,为了处理提供match_parent作为高度的大小的子视图,LinearLayout假装有一个绝对高度,重新计算子高度,然后重新使用上一个度量传递的子宽度。 基本上你的图像是无约束地计算高度和宽度,并获得默认的宽度和高度,然后重新计算高度,但被迫使用旧的宽度。 您将需要提供一个高度或覆盖一些View onMeasures

你也可以把重心放在线性布局上

注意:你也应该在drawables-hdpi / ldpi和mdpi中有不同的图像