2013-01-25 107 views
13

我有這個TextView。它的某些部分應該被對齊到左邊和右邊的一些部分。我將如何在Java中執行此操作?使android-textview的某個部分與右邊對齊

基本上,我想要第一行對齊到左側,下一行到右側等。

任何人都有線索?

編輯

我曾嘗試使用HTML,然後當沒有工作,我試圖跨越。

HTML嘗試

textView.setText(Html.fromHtml("<p align=\"right\">THIS IS TO THE RIGHT</p>")); 

而且繼承人的跨度嘗試

String LeftText = "LEFT"; 
    String RightText = "RIGHT"; 

    final String resultText = LeftText + " " + RightText; 
    final SpannableString styledResultText = new SpannableString(resultText); 
    styledResultText.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), LeftText.length() + 1, LeftText.length() + 2 +RightText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    textView.setText(styledResultText); 

但他們都不似乎工作。

回答

19
TextView resultTextView=new TextView(this); 
final String resultText = LeftText + " " + RightText; 
final SpannableString styledResultText = new SpannableString(resultText); 
styledResultText.setSpan((new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), LeftText.length() + 2, LeftText.length() + 2 +RightText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
resultTextView.setText(styledResultText); 

Alignment.ALIGN_OPPOSITE is the equivalent for right side.

Alignment.ALIGN_NORMAL is the equivalent for left side.

+1

是的,這是一個好方法(+1) –

+1

嗯。它不符合正確的。 textview中的引力是否重要? – user1991905

+1

@ user1991905'TextView'的重力在這裏很重要。儘量不要在xml中的'TextView'裏放置'android:gravity'。 –

2

兩種溶液:

1)具有用於每行不同的文本視圖,並設置其嚴重性。

2)使用HTML,而加載數據設置對齊在HTML它 REF:how-to-display-html-in-textview 這將無法正常工作align is not a supported tags 編輯:

而且

3:使用起來會跨度。

+0

嗯,我因子評分與HTML第二個解決方案將是一個偉大的方式做到這一點,但它did'nt工作.. textView.setText(Html.fromHtml (「

這應該是對的

」)); – user1991905

+0

認爲你已經嘗試過。 –

+0

textView.setText(Html.fromHtml(「

這應該是對的

」)); 你確定HTML中的對齊方式也適用於textview嗎? – user1991905

6

這裏是與Spannable工作,與cavate,如果左,右太寬,他們將在同一重疊的解決方案線。由於使用spannable進行左/右技巧需要在左和右之間換行,因此我的修復是添加一個spannable,將一行換行的行高降爲零(即重疊行),然後恢復正常行高那。

String fullText = leftText + "\n " + rightText;  // only works if linefeed between them! "\n "; 

    int fullTextLength = fullText.length(); 
    int leftEnd = leftText.length(); 
    int rightTextLength = rightText.length(); 

    final SpannableString s = new SpannableString(fullText); 
    AlignmentSpan alignmentSpan = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE); 
    s.setSpan(alignmentSpan, leftEnd, fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    s.setSpan(new SetLineOverlap(true), 1, fullTextLength-2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    s.setSpan(new SetLineOverlap(false), fullTextLength-1, fullTextLength, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

,我們有小程序來處理重疊線:

private static class SetLineOverlap implements LineHeightSpan { 
    private int originalBottom = 15;  // init value ignored 
    private int originalDescent = 13;  // init value ignored 
    private Boolean overlap;    // saved state 
    private Boolean overlapSaved = false; // ensure saved values only happen once 

    SetLineOverlap(Boolean overlap) { 
     this.overlap = overlap; 
    } 

    @Override 
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, 
          Paint.FontMetricsInt fm) { 
     if (overlap) { 
      if (!overlapSaved) { 
       originalBottom = fm.bottom; 
       originalDescent = fm.descent; 
       overlapSaved = true; 
      } 
      fm.bottom += fm.top; 
      fm.descent += fm.top; 
     } else { 
      // restore saved values 
      fm.bottom = originalBottom; 
      fm.descent = originalDescent; 
      overlapSaved = false; 
     } 
    } 
} 
+0

這實際上起作用了,很好的破解。 – Pedram

2

謝謝你的提示,@Frank,但這只是不夠:

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; 
    } 
} 

像這樣來使用:

CharSequence text = return new Truss() 
     .append("LEFT") 
     .pushSpan(LineOverlapSpan()) 
     .append("\n") 
     .popSpan() 
     .pushSpan(AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE)) 
     .append("RIGHT") 
     .build() 

其中Truss

A SpannableStringBuilder包裝的API沒有讓我想刺我的眼睛。