Pregunta

Estoy usando una vista de lista en Android 1.5 para mostrar una lista de las imágenes y el texto junto a la imagen. Estoy tratando de centrar verticalmente el texto, pero el texto está en la parte superior de la fila en lugar 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 necesito fijar alignParentTop = "true" cuando estoy tratando de centrar verticalmente el texto, pero si lo hago no el texto ni siquiera se presentó. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

EDITAR siguiendo los comentarios:

Resulta haciendo este trabajo con RelativeLayout no es fácil. En la parte inferior de la respuesta que he incluido un RelativeLayout que da el efecto deseado, pero sólo hasta que está incluido en un ListView. Después de eso, los mismos problemas que se describen en la cuestión ocurrieron. Esto fue fijada por lugar de utilizar 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 usted quiere tener dos cuadros de texto, puede anidar una segunda orientation="vertical" y LinearLayout después de la ImageView y luego poner los cuadros de texto en ese país.

Esto funciona, pero tengo que admitir que no sé por qué los RelativeLayouts no lo hicieron. Por ejemplo, este href="http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html" entrada de blog por Romain individuo específicamente dice que el RelativeLayout debería. Cuando lo probé, no me tengo que trabajar bastante; la verdad es 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 gran parte de la diferencia.


Aquí está la respuesta original:

Creo que estás confundiendo Android con todas esas instrucciones tanto contradictorios en RelativeLayout. Cambié formato 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 quitado muchos de su android:layout_alignParentxxx redundante, ya que no eran necesarias. Este punto de vista ahora viene con el cuadro en la esquina superior izquierda y el texto centrado verticalmente al lado de él. Si desea que la imagen centrada verticalmente así, entonces no se puede tener la RelativeLayout sea en android: layout_height = "wrap_content", ya que está tratando de hacerse no más alto que la altura de la imagen. Habría que especificar una altura de, por ejemplo, 80dp y, a continuación, establecer el ImageView a una altura fija como 60dp con android: ScaleType = "fitXY" para que sea escalar hacia abajo para encajar correctamente

.

Otros consejos

he quedado atrapado en un problema similar durante un tiempo, pero encontró esto desde CommonsWare:

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

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

Directiva de línea de base lo haría, pero ImageView simplemente no es compatible con la alineación de línea de base a partir de hoy. Puede solucionar esto mediante la creación de una subclase de ImageView, reemplazar el método getBaseline () y devolver la altura de la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top