ImageView: AdjustViewBounds не работает с layout_height = "fill_parent"? - PullRequest
15 голосов
/ 23 марта 2011

Я пытаюсь поместить в один ряд EditText с ImageView слева. Но я не могу заставить изображение масштабироваться должным образом, чтобы соответствовать высоте ввода текста.

Схема проста:

    <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"

тогда я получаю самое близкое представление о том, что мне было нужно: enter image description here

Но я не знаю точную высоту EditText, поэтому я не могу указать ее для ImageView здесь.


Когда указана высота для ImageView для заполнения его родителя (для соответствия высоте `` EditText`):

            android:layout_height="fill_parent"

тогда я получаю неожиданное дополнительное поле между изображением и вводом текста: enter image description here

На самом деле, в этом случае ширина ImageView равна ширине немасштабированного изображения, тогда как изображение было масштабировано.


Это похоже на изображение, показанное ниже, если указать layout_height на 48dp и установить adjustViewBounds на false:

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

enter image description here


Итак, здесь возникает вопрос: как правильно определить макет для масштабирования изображения в соответствии с высотой редактируемой записи и в то же время иметь ширину ImageView для сокращения до масштабированной ширины изображения? Другими словами, как избавиться от этого лишнего пространства?

Ответы [ 2 ]

7 голосов
/ 12 октября 2011

Это ошибка LinearLayout.Если вы посмотрите на forceUniformHeight в источнике здесь .Вы можете видеть, что для обработки размеров дочерних представлений, которые предоставляют match_parent в качестве высоты, когда LinearLayout установлен на wrap_content, LinearLayout претендует на абсолютную высоту, пересчитывает дочернюю высоту, а затем повторно использует дочернюю ширину из предыдущего показателяпроходить.В основном ваше изображение вычисляет высоту и ширину без ограничений и получает ширину и высоту по умолчанию, а затем пересчитывает высоту, но вынуждено использовать старую ширину.Вам нужно будет указать высоту или переопределить некоторые View onMeasures

0 голосов
/ 12 сентября 2011

Вы также можете поместить гравитацию по центру линейного макета

ПРИМЕЧАНИЕ: у вас также должны быть разные изображения в drawables-hdpi / ldpi и mdpi

...