5

Así que tengo dos TextViews por fila en un ListView. Uno debe dejarse y el otro alineado a la derecha. Ambos TextViews tienen un rectángulo redondeado como fondo que debe simplemente envolver el texto dentro. Así que se me ocurrió esto:Alinee dos TextViews, uno a la izquierda de la derecha, en un ListView sin estirar los fondos

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/text_right" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:background="@drawable/bubble_purple" 
     android:gravity="center" > 
    </TextView> 

    <TextView 
     android:id="@+id/text_left" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@id/text_right" 
     android:background="@drawable/bubble_blue" 
     android:gravity="center" > 
    </TextView> 
</RelativeLayout> 

Se ve bien para textos largos, pero no para los mensajes cortos:

enter image description here

También probé un LinearLayout así:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/text_left" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:background="@drawable/bubble_blue" 
     android:gravity="center" > 
    </TextView> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

    <TextView 
     android:id="@+id/text_right" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:background="@drawable/bubble_purple" 
     android:gravity="center"> 
    </TextView> 
</LinearLayout> 

Esto funciona para mensajes cortos pero no para los más largos:

enter image description here

¿Es de alguna manera posible medir el ancho combinado de TextViews y cambiar entre estos diseños mediante programación, o estoy haciendo algo mal aquí?

+1

Ponga un poco de peso diseño –

+0

Try androide: layout_weight = "1" para ambos – Android2390

+0

¿Cómo se debe a los dos 'TextViews' estirar si el primero es pequeño y el segundo es grande? – Luksprog

Respuesta

6

¿Funciona como usted quiere?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/text_right" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.5" 
    android:background="@drawable/bubble_blue" 
    android:text="2" 
    android:gravity="center" > 
</TextView> 

<TextView 
    android:id="@+id/text_left" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.5" 
    android:background="@drawable/bubble_purple" 
    android:text="9" 
    android:gravity="center" > 
</TextView> 
</LinearLayout> 

Mediante la adición de los parámetros layout_weight y hacerlas iguales, le dice al motor de la disposición de asignar ninguna habitación libre en partes iguales entre los dos puntos de vista. Si desea que el bloque izquierdo sea más grande que el derecho, puede darle un mayor peso.

Editar: Tal vez esto es mejor:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<LinearLayout 
    android:id="@+id/text_left" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.5" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="#456" 
     android:text="5 + 1" 
     android:gravity="center" > 
    </TextView> 

</LinearLayout> 

<TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text=" = " > 
</TextView> 

<LinearLayout 
    android:id="@+id/text_right" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layoutDirection="rtl" 
    android:layout_weight="0.5"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="#856" 
      android:text="6" 
      android:gravity="center" > 
     </TextView> 

</LinearLayout> 

</LinearLayout> 
+0

No, no exactamente. Claro, esto funciona para textos largos, pero para textos cortos esto [extiende los fondos] (http://img225.imageshack.us/img225/8269/linearstretchedbg.png). Idealmente, el fondo debe simplemente envolver el texto y debe haber espacio entre las burbujas para mensajes cortos, como en la segunda imagen de arriba. – wollan

+0

¡Agradable! Envolviéndolos en 'ViewGroups', nunca pensé en eso. Sin embargo, obtuve un "No identificador de recurso encontrado" para 'android: layoutDirection'. Pero cambiar el segundo 'LinearLayout' interno a' FrameLayout' y agregar un 'android: layout_gravity =" right "' hizo el truco. ¡Gracias! – wollan

Cuestiones relacionadas