2009-11-17 21 views
32

¿Cómo alinear el texto a la parte superior de un TextView?
API de Android equivalente para Swings setInsets()?
que está encima del texto debe empezar a estar en (0,0) de Vista de Texto¿Cómo alinear el texto a la parte superior de TextView?

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

    <TextView 
     android:id="@+id/text1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" 
     android:textSize="42sp" 
     android:paddingTop="0px" 
     android:gravity="top"> 
    </TextView> 
</LinearLayout> 

he utilizado anteriormente fragmento, sin embargo, todavía de salida no es el esperado
¿Alguna idea?

Respuesta

58

lo que el espacio en la parte superior de la Vista de Texto es el relleno utilizado para caracteres fuera del idioma Inglés como acentos. Para eliminar este espacio, puede establecer el atributo android:includeFontPadding en false en su XML o puede hacerlo programáticamente con la función setIncludeFontPadding(false).

Mire el SDK documentation for TextView si aún no está claro.

RESPUESTA EDITADO
Si estableciendo el atributo android:includeFontPadding no cumple lo que estás tratando de hacer, la otra solución es reemplazar el método de la TextView que está utilizando de manera onDraw(Canvas canvas) que elimina la parte superior adicional relleno que Android agrega a cada TextView. Después de escribir mi respuesta original, noté que, por alguna razón, TextView incluye relleno extra además del relleno de la fuente. También se elimina el relleno de fuente y, ya que este relleno adicional alinea perfectamente el texto con la parte superior de TextView. Mira el fragmento de código a continuación.

public class TopAlignedTextView extends TextView { 

    // Default constructor when inflating from XML file 
    public TopAlignedTextView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    // Default constructor override 
    public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs); 
     setIncludeFontPadding(false); //remove the font padding 
     setGravity(getGravity() | Gravity.TOP); //make sure that the gravity is set to the top 
    } 

    /*This is where the magic happens*/ 
    @Override 
    protected void onDraw(Canvas canvas){ 
     TextPaint textPaint = getPaint(); 
     textPaint.setColor(getCurrentTextColor()); 
     textPaint.drawableState = getDrawableState(); 
     canvas.save(); 

     //converts 5dip into pixels    
     int additionalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics()); 

     //subtracts the additional padding from the top of the canvas that textview draws to in order to align it with the top.    
     canvas.translate(0, -additionalPadding); 
     if(getLayout() != null) 
      getLayout().draw(canvas); 
     canvas.restore(); 
    } 
} 
+0

http://code.google.com/p/android/issues/detail?id=8435 :-( – Blundell

+0

¿Por qué no es trabajo para mí ?! –

+0

Sí, esto no funciona para mí tampoco – JPM

0

Im no estoy seguro si entiendo lo que estás significando, pero el texto dentro de la vista de texto se alineará con la parte superior si usas gravedad = arriba en la vista de texto.

Si se pone un color Backgrund en que Textview se pueden ver mejor lo que está pasando ...

Te supongo problema es que el TextView se centra ya que utiliza fill_parent tanto en altura y la anchura de la matriz LinearLayout . La TextView parece ser el único hijo a fin de tratar de poner la gravedad = superior en el LinearLayout ...

Eso es lo único que podía pensar ...

+0

he intentado eso también, sin embargo, no sirve .. –

1

creo que el fragmento es correcto. Supongo que le molestan algunos píxeles entre la parte superior de la letra "T" y el borde superior de TextView. Este espacio es necesario para representar algunas letras que no están presentes en el alfabeto inglés.

Comprobar que se vincula a conseguir idea:

+0

Sí, estás en lo correcto, es mejor si tenemos algún control sobre este, como anular este comportamiento predeterminado por nuestro propio. –

16

La fuente real en sí tiene un espacio en blanco adicional en la parte superior e inferior, creo.

Por lo general, lo que hago es dar a la vista márgenes negativos. El problema es que esto se ve mal cuando los dispositivos vienen con diferentes tipos de letra.

android:layout_marginTop="-5dp" 
android:layout_marginBottom="-5dp" 

Usted tendrá que ajustar en función del tamaño del texto, tamaños de texto más grandes requieren de relleno más negativa.

+0

Al usar fuentes personalizadas, después de probar muchas opciones como includeFontPadding, lineSpacingExtra y lineSpacing Multiplicador para eliminar espacios de fuente superior e inferior, este método es el único que funcionó. Lástima que necesito crear un estilo para cada tamaño de fuente utilizado. – Gero

5

En su .xml, escribir que:

android:gravity="center|top" 

El primer "centro" alinear la línea horizontal en el centro y el siguiente "top" alinear verticalmente hacia arriba.

Cuestiones relacionadas