2009-11-17 16 views
32

Come allineare il testo all'inizio di una TextView?
API Android equivalente per setInsets Swings()?
che è superiore del testo dovrebbe iniziare a essere (0,0) di TextViewCome allineare il testo all'inizio di 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> 

ho usato in precedenza frammento, comunque ancora uscita non è come previsto
Tutte le idee?

risposta

58

Così lo spazio nella parte superiore della TextView è imbottitura utilizzato per i caratteri al di fuori della lingua inglese, come accenti. Per rimuovere questo spazio, puoi impostare l'attributo android:includeFontPadding su false nel tuo XML oppure puoi farlo a livello di codice con la funzione setIncludeFontPadding(false).

Guardare allo SDK documentation for TextView se questo non è ancora chiaro.

RISPOSTA A CURA
Se impostando l'attributo android:includeFontPadding non compie quello che stai cercando di fare, l'altra soluzione è quella di sostituire il metodo della TextView che si sta utilizzando in modo onDraw(Canvas canvas) che elimina la parte superiore aggiuntivo riempimento che Android aggiunge a ogni TextView. Dopo aver scritto la mia risposta originale, ho notato che per qualche ragione TextView include un riempimento extra oltre al riempimento del font. Rimozione del carattere padding e come questo padding aggiuntivo allinea perfettamente il testo nella parte superiore del TextView. Guarda il frammento di codice qui sotto.

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

Perché non funziona per me ?! –

+0

Sì, questo non funziona per me o – JPM

0

Non sono sicuro di aver capito cosa intendete, ma il testo all'interno della vista testo sarà allineato in alto se si utilizza la gravità = in alto nella vista testo.

Se si mette un colore backgrund su di voi TextView si potrebbe vedere meglio ciò che sta accadendo ...

si Credo problema è che il TextView è centrato in quanto si utilizza fill_parent su altezza e larghezza sul LinearLayout genitore . Il TextView sembra essere l'unico bambino in modo da provare mettendo gravità = alto a LinearLayout ...

Questo è l'unica cosa che riuscivo a pensare ...

+0

ho cercato anche questo, però inutile .. –

1

Penso che la tua frammento è giusto. Immagino tu sia infastidito da alcuni pixel tra la parte superiore della lettera "T" e il bordo superiore del TextView? Questo spazio è necessario per rendere alcune lettere che non sono presenti nell'alfabeto inglese.

Verificare che collega per avere un'idea:

+0

Sì, lei ha ragione, è meglio se abbiamo un certo controllo su questo, come ignorare questo comportamento predefinito dal nostro. –

16

Il carattere stesso ha uno spazio in più in alto e in basso, credo.

Di solito quello che faccio è dare la vista margini negativi. Il problema è che questo sembra male quando i dispositivi sono dotati di diversi tipi di carattere.

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

È necessario regolare in base alle dimensioni del testo, le dimensioni del testo più grandi richiedono un riempimento negativo.

+0

Quando si utilizzano caratteri personalizzati, dopo aver provato molte opzioni come includeFontPadding, lineSpacingExtra e lineSpacing Moltiplicatore per rimuovere gli spazi dei caratteri superiore e inferiore, questo metodo è l'unico che ha funzionato. Peccato che ho bisogno di creare uno stile per ogni dimensione di carattere utilizzata. – Gero

5

Nel XML, scrivere che:

android:gravity="center|top" 

Il primo "centro" allineare la linea orizzontale al centro e il successivo "top" allineare verticalmente.

Problemi correlati