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>

2つのテキストボックスが必要な場合はorientation="vertical"、ImageViewの後に2番目の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)。ここで、親はListViewです。」

ただし、行の高さを特定の値に設定した場合にのみ機能します(つまり、wrap_contentを使用できません)。

于 2010-09-01T15:48:41.390 に答える
0

ベースラインディレクティブはそれを行いますが、ImageViewは今日の時点でベースラインアライメントをサポートしていません。これを回避するには、ImageViewのサブクラスを作成し、getBaseline()メソッドをオーバーライドして、画像の高さを返します。

于 2010-03-16T10:53:11.347 に答える