如何使用相对布局垂直对齐列表中的项目?

时间:2010-03-16 02:26:19

标签: android android-listview android-relativelayout

我在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”似乎很奇怪,但如果我不这样做,文本甚至都不显示。我做错了什么?

3 个答案:

答案 0 :(得分: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>

如果您想要两个文本框,可以在ImageView之后嵌套第二个orientation="vertical"和LinearLayout,然后将文本框放在那里。

这有效,但我不得不承认我不知道为什么RelativeLayouts没有。例如,这个blog post by 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,使其缩小以适合。

答案 1 :(得分:1)

暂时陷入了类似的问题,但是从CommonsWare发现了这个问题:

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

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

答案 2 :(得分:0)

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