2012-05-23 52 views
7

Estoy tratando de tener un TextView que tiene dos pedazos de texto, uno alineado contra el extremo izquierdo y otro contra el extremo izquierdo. Puedo poner espacios entre las dos palabras, pero me preguntaba si hay una mejor técnica.Android TextView Alinear texto a la derecha e izquierda

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/background_common" 
    android:id="@+id/LinearLayout0123"> 

    <TextView 
     android:layout_width="300dp" 
     android:layout_height="40dp" 
     android:textColor="@color/Black" 
     android:textStyle="bold" 
     android:textSize="15dp" 
     android:paddingLeft="10dp" 
     android:paddingTop="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginLeft="10dp" 
     android:background="@drawable/selector_social_facebook_twitter" 
     android:text="Right Text         Left Text" /> 
</LinearLayout> 

Respuesta

16

Aquí hay otro método:

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/background_common"> 
    <TextView 
     android:text="Left Text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="left"/> 
    <TextView 
     android:text="Right Text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right"/> 
</FrameLayout> 

Layout_gravity cuenta la pare nt dónde poner al niño. En FrameLayout, los niños pueden ir a cualquier lugar y otros niños no les obstruyen. Si hay superposición, el último niño agregado está en la parte superior. ¡Buena suerte!

+0

Pero no funciona correctamente cuando se desea utilizar el botón Atrás para borrar el texto introducido, ya que cada vez que se enfoca la edición de texto se coloca el cursor al inicio del texto introducido. –

4

Por qué no tener dos textviews en lugar de atascar el texto en una sola Textview

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="300dip" 
    android:layout_height="fill_parent" 
    android:background="@drawable/background_common" 
    android:id="@+id/LinearLayout0123"> 

    <TextView 
     android:layout_weight="1" 
     android:layout_width="0dip" 
     android:layout_height="40dp" 
     android:textColor="@color/Black" 
     android:textStyle="bold" 
     android:textSize="15dp" 
     android:paddingLeft="10dp" 
     android:paddingTop="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginLeft="10dp" 
     android:background="@drawable/selector_social_facebook_twitter" 
     android:text="Left Text" /> 

    <TextView 
     android:layout_weight="1" 
     android:layout_width="0dip" 
     android:layout_height="40dp" 
     android:textColor="@color/Black" 
     android:textStyle="bold" 
     android:textSize="15dp" 
     android:paddingLeft="10dp" 
     android:paddingTop="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginLeft="10dp" 
     android:background="@drawable/selector_social_facebook_twitter" 
     android:text="Right Text" /> 
</LinearLayout> 

Puede establecer androide: gravedad = "derecho" en el cuadro de texto a la derecha si desea que el texto sea alineado a la derecha

1

Esto sin duda va a trabajar para usted ...

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="5dp" 
     android:text="Left Side" 
     android:textSize="15sp" 
     android:textStyle="bold" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="5dp" 
     android:text="Right Side" 
     android:textSize="15sp" 
     android:textStyle="bold" /> 
</RelativeLayout> 
+3

op solicitó un LinearLayout. Además, "vote por favor" es demasiado lindo ... – katzenhut

1

Esto podría ser mejor, ya que no permite que los textos que se superponen.

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_gravity="start" /> 

    <TextView 
     android:id="@+id/sub_title" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1 
     android:layout_gravity="end" /> 
</LinearLayout> 
+0

Esto no alinea el texto al borde derecho –

1

Si todo lo que necesita es una sola línea (etiqueta: ... valor, o algo por el estilo), en realidad se puede lograr esto usando el lapso Alignment. El único problema es que el intervalo funciona para todo el párrafo, por lo que debe colocar los textos de la izquierda/derecha en párrafos separados y combinarlos con un tramo de "altura de línea cero" en una línea.

Algo como esto:

public void setLeftRightText(TextView view, String left, String right) { 
    SpannableString merged = new SpannableString(left + "\n" + right); 
    merged.setSpan(
      new AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL), 
      0, left.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE 
    ); 
    merged.setSpan(
      new LineOverlapSpan(), 
      left.length(), left.length() + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE 
    ); 
    merged.setSpan(
      new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE), 
      left.length() + 1, left.length() + 1 + right.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE 
    ); 
    view.setText(merged); 
} 

Cuando el LineOverlapSpan se implementa como esto:

public class LineOverlapSpan implements LineHeightSpan { 
    @Override 
    public void chooseHeight(final CharSequence text, final int start, final int end, final int spanstartv, final int v, final Paint.FontMetricsInt fm) { 
     fm.bottom += fm.top; 
     fm.descent += fm.top; 
    } 
} 

Ver this answer para más detalles.

0

Esta es la manera más simple que he encontrado para hacerlo. El truco es usar match_parent en la segunda vista de texto, de modo que ocupa el espacio restante y permite que el atributo gravity mueva el texto al final.

Cuestiones relacionadas