Как я вертикально выравниваю объект в рамках списка с помощью относительного расположения?

Я использую представление списка в Android 1.5 для показа списка изображений и текста рядом с изображением. Я пытаюсь вертикально центрировать текст, но текст наверху строки вместо в центре. Ниже мое расположение:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dip">

    <ImageView android:id="@+id/item_image" android:layout_width="wrap_content" 
        android:layout_height="wrap_content"  android:paddingRight="10dip" 
        android:src="@drawable/default_image" android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"/>

    <TextView android:id="@+id/item_title" 
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:layout_toRightOf="@id/item_image" 
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        />

</RelativeLayout>

Кажется странным, что я должен установить alignParentTop = "верный", когда я пытаюсь вертикально центрировать текст, но если я не делаю текст даже не обнаруживается. Что я делаю неправильно?

6
задан Onik 13 September 2015 в 21:22
поделиться

2 ответа

EDIT после комментариев:

Оказывается, заставить это работать с RelativeLayout не так-то просто. Внизу ответа я включил RelativeLayout, который дает желаемый эффект, но только пока он не включен в ListView. После этого возникают те же проблемы, что описаны в вопросе. Это было исправлено, если вместо этого использовать LinearLayout(ы).

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:orientation="horizontal">

    <ImageView android:id="@+id/pickImageImage" 
        android:layout_width="100dp"
        android:layout_height="80dp"
        android:background="@drawable/icon"
        android:scaleType="fitXY"
        android:layout_marginRight="10dp"/>

    <TextView android:id="@+id/pickImageText" 
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:gravity="left|center_vertical"
        android:text="I'm the text"/>

</LinearLayout>

Если вы хотите иметь два текстовых поля, вы можете вложить второе orientation="vertical" и LinearLayout после ImageView, а затем поместить текстовые поля туда.

Это работает, но я должен признаться, что не знаю, почему RelativeLayouts не работает. Например, в этом сообщении в блоге Romain Guy конкретно говорится, что RelativeLayout должен работать. Когда я попробовал, у меня так и не получилось; признаться, я сделал это не точно так, как он, но мои единственные изменения касались некоторых атрибутов TextViews, что не должно было иметь большого значения.


Вот оригинальный ответ:

Я думаю, вы путаете Android со всеми этими несколько противоречивыми инструкциями в RelativeLayout. Я переформатировал вашу вещь в следующее:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dip">

    <ImageView android:id="@+id/item_image"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingRight="10dip" 
        android:src="@drawable/icon"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"/>

    <TextView android:id="@+id/item_title" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_toRightOf="@id/item_image" 
        android:layout_centerVertical="true"
        android:text="Blah!"/>

</RelativeLayout>

И это работает нормально. Я удалил многие из ваших избыточных android:layout_alignParentxxx, потому что они были не нужны. Теперь этот вид отображается с картинкой в левом верхнем углу и текстом, вертикально центрированным рядом с ней. Если вы хотите, чтобы картинка также была вертикально центрирована, то вы не можете использовать RelativeLayout на android:layout_height="wrap_content", потому что он пытается сделать себя выше, чем высота картинки. Вам придется указать высоту, например, 80dp, а затем установить ImageView на фиксированную высоту, например, 60dp с android:scaleType="fitXY", чтобы он уменьшился до нужного размера.

16
ответ дан 8 December 2019 в 13:45
поделиться

Директива Baseline сделает это, но ImageView на сегодняшний день просто не поддерживает выравнивание базовой линии. Вы можете обойти это, создав подкласс ImageView, переопределив метод getBaseline () и вернув высоту изображения.

0
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: