2009-11-17 6 views
32

Wie richtet man den Text an den Anfang eines TextView?
Äquivalente Android API für Swings setInsets()?
die Spitze des Textes sollWie richtet man den Text am oberen Ende von TextView aus?

<?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> 

Ich habe oben Schnipsel verwendet, jedoch in (0,0) von Textview starten wird noch ausgegeben wird als nicht zu erwarten
Irgendwelche Ideen?

Antwort

58

So ist der Platz an der Spitze des Textview-Polsterung für Zeichen außerhalb der englischen Sprache wie Akzente verwendet wird. Um diesen Bereich zu entfernen, können Sie entweder das android:includeFontPadding-Attribut in Ihrem XML-Code auf false setzen oder Sie können dies programmgesteuert mit der Funktion setIncludeFontPadding(false) tun.

Betrachten Sie die SDK documentation for TextView, wenn dies noch unklar ist.

EDITED ANTWORT
die android:includeFontPadding Attribut Wenn Einstellung erreichen nicht das, was Sie versuchen, die onDraw(Canvas canvas) Methode der Textview zu tun, ist die andere Lösung außer Kraft zu setzen, die Sie so verwenden, dass sie die zusätzlichen oben beseitigt Padding, die Android zu jedem TextView hinzufügt. Nachdem ich meine ursprüngliche Antwort geschrieben habe, ist mir aufgefallen, dass TextView aus irgendeinem Grund zusätzlich zur Zeichensatzauffüllung eine zusätzliche Auffüllung enthält. Entfernen der Schriftartauffüllung sowie, da diese zusätzliche Auffüllung den Text perfekt an den Anfang der Textansicht ausrichtet. Sehen Sie sich das unten stehende Code-Snippet an.

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

Warum funktioniert es nicht für mich ?! –

+0

Ja, das funktioniert nicht für mich entweder – JPM

0

Ich bin nicht sicher, ob ich verstehe, was Sie bedeuten, aber der Text in der Textansicht wird nach oben ausgerichtet sein, wenn Sie gravity = top in der Textansicht verwenden.

Wenn Sie eine grund Farbe auf der Sie Textview Sie vielleicht besser sehen, was passiert ...

ich Ihnen Problem erraten ist, dass der Textview zentriert ist, da Sie fill_parent auf Höhe und Breite auf der übergeordneten Linearlayout verwenden . Die Textview scheint das einzige Kind zu sein, so versuchen die Schwerkraft setzen = top auf dem Linearlayout ...

Das ist das einzige, was ich denken konnte ...

+0

Ich habe das auch versucht, aber keine Verwendung .. –

1

Ich denke, Ihr Snippet richtig ist. Ich nehme an, Sie stören sich an einigen Pixeln zwischen dem oberen Rand des Buchstabens "T" und der oberen Kante des TextView? Dieser Platz wird benötigt, um einige Buchstaben darzustellen, die im englischen Alphabet nicht vorhanden sind.

prüfen, die Idee Links zu erhalten:

+0

Ja, du hast Recht, es ist besser, wenn wir eine gewisse Kontrolle über diese haben, wie Überschreiben dieses Standardverhalten von unseren eigenen. –

16

Die eigentliche Schriftart selbst hat extra Leerzeichen auf der Oberseite und Unterseite glaube ich.

Normalerweise, was ich mache, ist die Ansicht negative Ränder. Das Problem ist, dass dies schlecht aussieht, wenn Geräte mit unterschiedlichen Schriftarten geliefert werden.

Sie müssen basierend auf der Textgröße anpassen, größere Textgrößen erfordern mehr negative Padding.

+0

Bei Verwendung von benutzerdefinierten Schriftarten nach dem Testen vieler Optionen wie includeFontPadding, lineSpacingExtra und lineSpacing Multiplikator zum Entfernen der oberen und unteren Schriftfelder, diese Methode ist die einzige, die funktioniert. Schade, dass ich für jede verwendete Schriftgröße einen Stil erstellen muss. – Gero

5

In Ihrem .xml, schreiben, daß:

android:gravity="center|top" 

Die erste "center" align Ihre Linie horizontal in der Mitte und die nächsten "oben" ausgerichtet vertikal nach oben.

Verwandte Themen