¿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?
- PercentRelativeLayout, cómo establecer la altura mediante programación
- Disposición relativa de Android alignParentRight y alignParentEnd
- Android ScrollView fillViewport no funciona
- Margen relativo de Android RelativeLayout
- OnMeasure de la vista personalizada: cómo obtener el ancho en función de la altura
- Marshmallow RelativeLayout se comporta de forma extraña con alignBaseline
- Android hacer botón 1/3 de ancho de pantalla y la altura en el diseño relativo
- Cómo dibujar línea de separación vertical entre dos línea de texto de Android?
- Diferencias entre ConstraintLayout y RelativeLayout
- El RelativeLayout de Android parece estar roto
- Cómo establecer vistas en RelativeLayout mediante programación?
- Android RelativeLayout cambiar altura de forma programática
- Porcentaje de ancho de un RelativeLayout
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: Cuando configuro OnClickListener para un ListView
- Cómo escribir un reproductor de vídeo simple en Android?