2012-06-20 21 views
8

Ist es möglich, für jede Textzeile eines TextView individuelle Zeilenabstände zu definieren?Individueller Zeilenabstand für jede Zeile

Beispiel:

TextView tv = new TextView(context); 
tv.setText("line1\nline2\nline3"); 

Verfahren setLineSpacing(float add, float mult) die Linienabstände für alle Textzeilen des TextView definiert. Ich möchte einen anderen Zeilenabstand zwischen Zeile1 und Zeile2 und einen anderen Zeilenabstand zwischen Zeile2 und Zeile3 definieren.

Irgendwelche Ideen, wie man das macht?

Bietet eine spannbare Lösung?

Antwort

1

Sie können diese Art von spezifischen Stilen für die Textansicht mit HTML. Versuchen Sie dieses Beispiel

tv.setText(Html.fromHtml("<h2>Text1</h2><br><p>Text2</p>")); 

Verschiedene Arten von Tags hier erlaubt sind,

<a href="..."> 
<b> 
<big> 
<blockquote> 
<br> 
<cite> 
<dfn> 
<div align="..."> 
<em> 
<font size="..." color="..." face="..."> 
<h1> 
<h2> 
<h3> 
<h4> 
<h5> 
<h6> 
<i> 
<img src="..."> 
<p> 
<small> 
<strike> 
<strong> 
<sub> 
<sup> 
<tt> 
<u> 
+0

während dies funktioniert, ist es sehr teuer, da eine ganze Reihe von XML-Parsing-Code intern aufgerufen wird. Sei vorsichtig damit – martyglaubitz

-3

Sein nicht possible.This Technik ist die Verwendung in C, C++. Was Sie in setText() verwenden, zeigt es die ganzer Text, den du schreibst.

+3

Diese Antwort ist nicht korrekt. Bitte sehen Sie Joe's Antwort. –

16

Ja, Sie können es tun, indem Sie die LineHeightSpan Schnittstelle verwenden. Hier ist ein schneller und schmutziger Beispielcode, wie dies zu tun:

public class MyActivity extends Activity { 

    private static class MySpan implements LineHeightSpan { 
     private final int height; 

     MySpan(int height) { 
      this.height = height; 
     } 

     @Override 
     public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, 
       FontMetricsInt fm) { 
      fm.bottom += height; 
      fm.descent += height; 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final TextView tv = new TextView(this); 
     setContentView(tv); 

     tv.setText("Lines:\n", BufferType.EDITABLE); 
     appendLine(tv.getEditableText(), "Line 1 = 40\n", 40); 
     appendLine(tv.getEditableText(), "Line 2 = 30\n", 30); 
     appendLine(tv.getEditableText(), "Line 3 = 20\n", 20); 
     appendLine(tv.getEditableText(), "Line 4 = 10\n", 10); 
    } 

    private void appendLine(Editable text, String string, int height) { 
     final int start = text.length(); 
     text.append(string); 
     final int end = text.length(); 
     text.setSpan(new MySpan(height), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 

} 
+0

Danke Joseph, das ist ein ausgezeichnetes und sehr nützliches Beispiel, ich habe es getestet und es funktioniert! –

+0

Dies scheint nach Zeile 4 zusätzlichen Raum der Größe 40 hinzuzufügen. Gibt es eine elegante Möglichkeit, diesen zusätzlichen Raum loszuwerden? – erin

+0

@erin Ich habe 'tv.getEditableText(). Append ("Zeile 5 \ nLine 6"); 'nach dem letzten Aufruf von appendLine() in onCreate() hinzugefügt und den von Ihnen erwähnten zusätzlichen Platz nicht gesehen, vielleicht sind wir es auch nicht über dasselbe reden? – Joe

-3

Try this:

android:lineSpacingMultiplier = "3" 

Zeilenabstand kann auch in Dezimal-Format vorliegen.

+0

Ich hatte keine Chance, diese 100% zu überprüfen, aber ich denke, das löst tatsächlich das Problem für meinen Anwendungsfall, nicht sicher, warum es abgelehnt wurde. – CodyEngel

+2

@HuskyHuskie Dies ändert den Zeilenabstand für die gesamte Ansicht, während OP den Zeilenabstand für einzelne Zeilen ändern möchte. – Darkwater