2013-01-25 9 views
13

Mam to TextView. Niektóre części mają być wyrównane do lewej, a niektóre do prawej. Jak mam to zrobić w Javie?Wyrównaj pewną część wyskakującego tekstu na prawo z obrazka w prawo.

Zasadniczo chcę, aby pierwsza linia była wyrównana do lewej, a następna linia do prawej i tak dalej.

Ktoś ma wskazówkę?

EDIT

Próbowałem używać HTML, a następnie, gdy to nie pomogło Próbowałem przęseł.

html próba

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

I herezje próba rozpiętość

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

Ale żaden z nich nie wydaje się działać.

Odpowiedz

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

tak to jest również dobry sposób (+1) –

+1

Hmm. Nie wyrównuje się w prawo. Czy grawitacja w tekście ma znaczenie? – user1991905

+1

@ user1991905 grawitacja 'TextView' ma tutaj znaczenie. Staraj się nie nadawać 'android: gravity' wewnątrz' TextView' w twoim xml. –

2

dwa rozwiązania:

1) mają inny widok tekstu dla każdej linii i ustawić jego wagi.

2) używać HTML podczas ładowania danych ustawień wyrównania w html dla niego REF:how-to-display-html-in-textview To nie zadziałaalign is not a supported tags edycja:

także

3: będzie używać rozpiętość.

+0

Hmm myślałam, że drugie rozwiązanie z HTML byłby to świetny sposób, aby to zrobić, ale nie zrobił to działa .. textView.setText (Html.fromHtml ("

To powinno być po prawej stronie

")); – user1991905

+0

zaopiekuj się tym, co próbujesz. –

+0

textView.setText (Html.fromHtml ("

To powinno być po prawej

")); Czy jesteś pewien, że wyrównanie z html działa również w widoku tekstowym? – user1991905

6

Oto rozwiązanie, które współpracuje z Spannable, z cavate że jeśli prawy i lewy są zbyt szerokie, będą one nakładają na taki sam linia. Ponieważ wykonanie lewy/prawy trik z spannable wymaga posuwania linii pomiędzy lewym i prawym, moja poprawka polega na dodaniu spannable, która redukuje wysokość linii do zera (tj. Zachodzące na siebie linie) dla jednego podania liniowego, a następnie przywraca normalną wysokość linii po że.

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

I mamy małą rutynę do obsługi nakładających się linii:

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

To naprawdę działa, świetny hack. – Pedram

2

Dzięki za cynk, @Frank, ale to było tylko tyle:

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

Używane tak :

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

gdzie Truss to

Opakowanie, którego interfejs API nie powoduje, że chcę ukłuć wzrok.