2010-03-16 2 views
6

Ich verwende eine Listenansicht in Android 1.5, um eine Liste von Bildern und Text neben dem Bild anzuzeigen. Ich versuche, den Text vertikal zu zentrieren, aber der Text befindet sich an der Spitze der Zeile statt zentriert. Unten ist mein Layout:Wie richte ich ein Element in einer Liste mithilfe des relativen Layouts vertikal aus?

<?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> 

Es scheint seltsam, dass ich alignParentTop = „true“ festlegen müssen, wenn ich den Text vertikal zentriert versucht bin, aber wenn ich den Text nicht tun zeigt nicht einmal auf. Was mache ich falsch?

Antwort

16

EDIT folgende Kommentare:

Es stellt sich heraus, diese Arbeit mit RelativeLayout machen, ist nicht einfach. Am Ende der Antwort habe ich ein RelativeLayout eingefügt, das den gewünschten Effekt liefert, aber nur bis es in einem ListView enthalten ist. Danach traten die gleichen Probleme wie in der Frage beschrieben auf. Dies wurde behoben, indem LinearLayout (s) verwendet wurde.

<?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> 

Wenn Sie zwei Textfelder haben, können Sie nisten eine zweite orientation="vertical" und Linearlayout nach dem Image und dann dort die Textfelder setzen.

Das funktioniert, aber ich muss zugeben, ich weiß nicht, warum die RelativeLayouts nicht. Zum Beispiel sagt dies blog post by Romain Guy ausdrücklich, dass das RelativeLayout sollte. Als ich es versucht habe, habe ich es nie richtig gemacht; zugegebenermaßen tat ich es nicht genau als er tat, aber meine einzigen Änderungen waren mit einigen Attributen der TextViews, die nicht so viel Unterschied gemacht haben sollte.


Hier ist die ursprüngliche Antwort:

Ich glaube, Sie verwechseln Android mit allen jenen etwas widersprüchlichen Anweisungen in RelativeLayout. Ich umformatiert Ihre Sache so aus:

<?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> 

Und das funktioniert gut. Ich habe viele Ihrer überflüssigen android:layout_alignParentxxx entfernt, weil sie nicht notwendig waren. In dieser Ansicht erscheint nun das Bild in der oberen linken Ecke und der Text vertikal zentriert daneben. Wenn das Bild auch vertikal zentriert werden soll, darf das RelativeLayout nicht auf android: layout_height = "wrap_content" liegen, da es versucht, sich nicht größer als die Höhe des Bildes zu machen. Sie müssten eine Höhe angeben, z. 80dp, und dann setzen Sie das ImageView auf eine feste Höhe wie 60dp mit Android: scaleType = "fitXY", um es zu verkleinern, um richtig zu passen.

+0

Danke für den Versuch. Ich möchte, dass das Layout nicht größer als das Bild ist, also ist das Bild in Ordnung.Ich habe dein XML ausprobiert und sehe das selbe, was ich mit meinem gesehen habe. Der Text wird nicht angezeigt, wenn ich nicht android: layout_alignParentTop = "true" zum TextView hinzufüge, und dann ist es natürlich top-gerecht anstatt zentriert. Hast du deine in einen ListView gesteckt? –

+0

Hmm. Es funktionierte gut, wenn es eine eigene Ansicht war, aber als ich es zu einem ListView hinzufügte, dann ja, hörte es auf zu arbeiten. Ich habe gerade ein paar Dinge ausprobiert und nichts hat sich so gut bewährt wie mit RelativeLayout. Sie können den gleichen Effekt jedoch mit einem LinearLayout erzielen. Setzen Sie die Ausrichtung auf horizontal und stellen Sie die TextView-Höhe dann auf fill_parent mit center_vertical gravity ein. Wenn Sie mehrere TextViews neben dem Symbol haben möchten, können Sie sie in ein zweites vertikales LinearLayout einfügen. Das ist nicht elegant, aber ich kann nicht herausfinden, warum die RelativeLayouts nicht funktionierten ... –

+0

Konnten Sie Ihre Antwort redigieren, um LinearLayout zu erwähnen? Das scheint zu funktionieren. –

0

Die Baseline-Direktive würde es tun, aber ImageView unterstützt die Grundlinienausrichtung ab heute nicht. Sie können dies umgehen, indem Sie eine Unterklasse von ImageView erstellen, die getBaseline() -Methode überschreiben und die Höhe des Bildes zurückgeben.

+0

Danke, ich werde das heute Abend versuchen, um zu sehen, ob es funktioniert. Es scheint ein Problem zu sein, ImageView abzulehnen, aber ich werde es ausprobieren. –

1

War eine Zeit lang auf einem ähnlichen Problem stecken, aber fanden diese von CommonsWare:

„Wenn Sie das Layout aufblasen, verwenden inflate(R.layout.whatever, parent, false), wo Eltern die Listview ist.“

Funktioniert aber nur, wenn Sie die Höhe der Zeile auf einen bestimmten Wert festlegen (dh Sie können wrap_content nicht verwenden).

Verwandte Themen