Come posso allineare verticalmente un elemento all'interno di una lista utilizzando il layout relativo?

StackOverflow https://stackoverflow.com/questions/2451744

Domanda

Sto usando una visualizzazione elenco in Android 1.5 per visualizzare un elenco di immagini e il testo accanto all'immagine. Sto cercando di centrare verticalmente il testo ma il testo è in cima alla fila anziché centrato. Di seguito è riportato il mio layout:

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

Sembra strano che ho bisogno di impostare alignParentTop = "true" quando sto cercando di centrare il testo in verticale, ma se lo faccio non il testo non ha nemmeno vedere. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

EDIT in seguito alle osservazioni:

Si scopre facendo questo lavoro con RelativeLayout non è facile. Nella parte inferiore della risposta ho incluso un RelativeLayout che dà l'effetto desiderato, ma solo fino a quando non è incluso in un controllo ListView. Dopo di che, gli stessi problemi descritti nella domanda si è verificato. Questo è stato fissato dal utilizzando invece 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>

Se si desidera avere due caselle di testo, è possibile nidificare un secondo orientation="vertical" e LinearLayout dopo l'ImageView e poi mettere le caselle di testo in là.

Questo funziona, ma devo ammettere che non so perché le RelativeLayouts no. Ad esempio, questo post sul blog di Romain Guy in particolare dice che il RelativeLayout dovrebbe. Quando ho provato, non ho mai capito il lavoro del tutto; devo ammettere che non l'ho fatto esattamente come ha fatto, ma i miei unici cambiamenti sono stati con alcuni attributi dei TextViews, che non dovrebbe hanno fatto che molto di una differenza.


Ecco la risposta originale:

Credo che tu stia confondendo Android con tutte quelle istruzioni un po 'contraddittorie in RelativeLayout. Ho riformattato la vostra passione a questo:

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

e che funziona bene. Ho rimosso molti dei vostri android:layout_alignParentxxx ridondanti perché non erano necessarie. Questo punto di vista ora esce con l'immagine in alto a sinistra e il testo centrato verticalmente accanto ad essa. Se si desidera che l'immagine verticalmente centrato così, allora non si può avere la RelativeLayout sia su Android: layout_height = "wrap_content", perché sta cercando di farsi non più alto di l'altezza dell'immagine. Dovresti specificare un'altezza, per esempio 80dp, e quindi impostare l'ImageView ad un'altezza fissa come 60dp con Android: scaleType = "fitXY" per farlo scalare verso il basso per adattarsi correttamente

.

Altri suggerimenti

È stato bloccato su un problema simile per un po ', ma ho trovato questo da CommonsWare:

"Quando si gonfia il layout, utilizzare inflate(R.layout.whatever, parent, false), in cui padre è il ListView."

Opere, ma solo quando si imposta l'altezza della riga su un valore specifico (cioè non è possibile utilizzare wrap_content).

direttiva Baseline avrebbe fatto, ma ImageView semplicemente non sostenere l'allineamento della linea di base a partire da oggi. È possibile aggirare questo creando una sottoclasse di ImageView, l'override del metodo getBaseline () e restituire l'altezza dell'immagine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top