Я использую представление списка в 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 = "верный", когда я пытаюсь вертикально центрировать текст, но если я не делаю текст даже не обнаруживается. Что я делаю неправильно?
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", чтобы он уменьшился до нужного размера.
Директива Baseline сделает это, но ImageView на сегодняшний день просто не поддерживает выравнивание базовой линии. Вы можете обойти это, создав подкласс ImageView, переопределив метод getBaseline () и вернув высоту изображения.