¿Cómo puedo alinear verticalmente un elemento dentro de una lista usando el diseño relativo?

Estoy usando una vista de lista en Android 1.5 para mostrar una lista de imágenes y texto junto a la imagen. Estoy intentando centrar verticalmente el texto pero el texto está en la tapa de la fila en vez de centrado. A continuación se muestra mi diseño:

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

Parece extraño que necesite establecer alignParentTop = "true" cuando estoy tratando de centrar verticalmente el texto, pero si no lo hago, el texto ni siquiera aparece. ¿Qué estoy haciendo mal?

EDITAR después de los comentarios:

Resulta que hacer este trabajo con RelativeLayout no es fácil. En la parte inferior de la respuesta he incluido un RelativeLayout que da el efecto deseado, pero sólo hasta que se incluye en un ListView. Después de eso, los mismos problemas descritos en la pregunta ocurrieron. Esto se corrigió utilizando 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> 

Si desea tener dos cuadros de texto, puede anidar una segunda orientation="vertical" y LinearLayout después del ImageView y, a continuación, colocar los cuadros de texto allí.

Esto funciona, pero tengo que admitir que no sé por qué los RelativeLayouts no. Por ejemplo, esta entrada del blog de Romain Guy dice específicamente que el RelativeLayout debería. Cuando lo probé, nunca conseguí que funcionara bien; Es cierto que no lo hice exactamente como lo hizo, pero mis únicos cambios fueron con algunos atributos de los TextViews, que no debería haber hecho que una gran diferencia.


Aquí está la respuesta original:

Creo que estás confundiendo a Android con todas esas instrucciones algo contradictorias en RelativeLayout. He reformateado su cosa a esto:

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

Y eso funciona bien. He eliminado muchos de sus android:layout_alignParentxxx redundantes android:layout_alignParentxxx porque no eran necesarios. Esta vista ahora viene con la imagen en la esquina superior izquierda y el texto centrado verticalmente junto a ella. Si desea que la imagen se centre verticalmente también, entonces no puede tener el RelativeLayout en android: layout_height = "wrap_content" porque está tratando de hacerse no más alto que la altura de la imagen. Tendrías que especificar una altura, por ejemplo, 80dp, y luego establecer el ImageView a una altura fija como 60dp con android: scaleType = "fitXY" para hacerla escala hacia abajo para encajar correctamente.

Estaba atascado en un tema similar por un tiempo, pero encontré esto desde CommonsWare:

"Cuando infle el diseño, utilice inflate(R.layout.whatever, parent, false) , donde parent es ListView."

Funciona, pero sólo cuando se establece la altura de la fila a un valor específico (es decir, no se puede utilizar wrap_content).

Baseline directiva lo haría, pero ImageView simplemente no soporta la alineación de la línea de base a partir de hoy. Puede evitar esto creando una subclase de ImageView, anular el método getBaseline () y devolver la altura de la imagen.

  • Android RelativeLayout Selector state_pressed no funciona
  • Cómo construir un teclado de sugerencias de diseño en Android
  • El widget Android AppBarLayout siempre aparece en la parte superior
  • Inserción de contenido con escala escalable personalizada
  • No se permite el diseño relativo en la barra de herramientas
  • ¿Cómo puede alguien crear una lista de desplazamiento horizontal con efecto de ajuste al centro
  • FrameLayout vs RelativeLayout para superposiciones
  • ¿Cómo obtener RelativeLayout trabajando con la fusión y la inclusión?
  • ¿Cuáles son las diferencias entre LinearLayout, RelativeLayout y AbsoluteLayout?
  • Configuración de RelativeLayout en código java
  • Ajuste la altura de SwipeRefreshLayout para colocar View en la parte inferior de la misma
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.