Как мне выровнять элемент в списке по вертикали, используя относительное расположение?
-
20-09-2019 - |
Вопрос
Я использую представление списка в 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() и вернув высоту изображения.