Как мне выровнять элемент в списке по вертикали, используя относительное расположение?

StackOverflow https://stackoverflow.com/questions/2451744

Вопрос

Я использую представление списка в 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 ="true", когда я пытаюсь отцентрировать текст по вертикали, но если я этого не сделаю, текст даже не отобразится.Что я делаю не так?

Это было полезно?

Решение

ОТРЕДАКТИРУЙТЕ, следуя комментариям:

Оказывается, заставить это работать с 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 этого не сделали.Например, это запись в блоге Ромена Ги в частности, говорится, что 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", чтобы уменьшить его размер до нужного размера.

Другие советы

Некоторое время застрял над аналогичной проблемой, но нашел это на CommonsWare:

"Когда вы раздуваете макет, используйте inflate(R.layout.whatever, parent, false), где parent - это ListView ."

Работает, но только когда вы устанавливаете высоту строки в определенное значение (т. Е. вы не можете использовать wrap_content).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top