6

我在 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" 似乎很奇怪,但如果我不这样做,文本甚至不会出现。我究竟做错了什么?

4

3 回答 3

16

编辑以下评论:

事实证明,使用 RelativeLayout 进行这项工作并不容易。在答案的底部,我包含了一个可以提供所需效果的 RelativeLayout,但仅在它包含在 ListView 中之前。之后,出现了与问题中描述的相同的问题。这是通过使用 LinearLayout(s) 解决的。

<?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"在 ImageView 之后嵌套第二个和 LinearLayout,然后将文本框放在那里。

这行得通,但我不得不承认我不知道为什么 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,然后使用 android:scaleType="fitXY" 将 ImageView 设置为固定高度,例如 60dp,以使其缩小以适合。

于 2010-03-16T11:00:13.390 回答
1

在类似的问题上停留了一段时间,但从 CommonsWare 中找到了这个:

“当您膨胀布局时,请使用inflate(R.layout.whatever, parent, false),其中 parent 是 ListView。”

仅当您将行的高度设置为特定值时才有效(即您不能使用 wrap_content)。

于 2010-09-01T15:48:41.390 回答
0

基线指令会做到这一点,但 ImageView 根本不支持基线对齐到今天。您可以通过创建 ImageView 的子类、覆盖 getBaseline() 方法并返回图像的高度来解决此问题。

于 2010-03-16T10:53:11.347 回答