2013-02-20 10 views
33

Załóżmy, że mam kolejny tekst:Jak ustawić wiele przęści w tekście TextView na tym samym tekście częściowym?

Witam StackOverflow

I życzę, aby ustawić drugie słowo jest zarówno RelativeSizeSpan (ustawić względny rozmiar czcionki) i TextAppearanceSpan (aby ustawić kolor tekstu), jak scalić je obie?

Wiem tylko, że mogę wybrać jedną z nich, korzystając z kolejnego kodu na przykład:

final SpannableString textToShow = new SpannableString("Hello stackOverflow"); 
textToShow.setSpan(new RelativeSizeSpan(1.5f), textToShow.length() - "stackOverflow".length(),textToShow.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setText(textToShow); 

Ale muszę również ustawić kolor, a nawet dodać inne funkcje z innych klas obejmujących ..

Co mogę zrobić?

+0

zobaczyć również https://stackoverflow.com/a/41953808 – Suragch

Odpowiedz

63

Po prostu ustaw dodatkowe przęsła. W razie potrzeby będą się nakładać/scalać. Ten kod działa dla mnie:

final SpannableString text = new SpannableString("Hello stackOverflow"); 
text.setSpan(new RelativeSizeSpan(1.5f), text.length() - "stackOverflow".length(), text.length(), 
      Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
text.setSpan(new ForegroundColorSpan(Color.RED), 3, text.length() - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
tv.setText(text); 
+0

co jest "3"? –

+6

losowa liczba, którą miałem w głowie. Jest tutaj tylko po to, aby pokazać, że możesz mieć wiele przęseł przecinających się nawzajem. – Zielony

+0

to zdecydowanie najszybsza odpowiedź, którą mam i którą wybrałem jako właściwą. gratulacje ! –

27

wiem, że to nowa odpowiedź już odpowiedział na pytanie, ale chciałbym podzielić klasę użytkową zrobiłem co sprawia, że ​​to zadanie łatwiejsze.

public class SimpleSpanBuilder { 
    private class SpanSection{ 
     private final String text; 
     private final int startIndex; 
     private final CharacterStyle[] styles; 

     private SpanSection(String text, int startIndex,CharacterStyle... styles){ 
      this.styles = styles; 
      this.text = text; 
      this.startIndex = startIndex; 
     } 

     private void apply(SpannableStringBuilder spanStringBuilder){ 
      if (spanStringBuilder == null) return; 
      for (CharacterStyle style : styles){ 
       spanStringBuilder.setSpan(style, startIndex, startIndex + text.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      } 
     } 
    } 

    private List<SpanSection> spanSections; 
    private StringBuilder stringBuilder; 

    public SimpleSpanBuilder(){ 
     stringBuilder = new StringBuilder(); 
     spanSections = new ArrayList<>(); 
    } 

    public SimpleSpanBuilder append(String text,CharacterStyle... styles){ 
     if (styles != null && styles.length > 0) { 
      spanSections.add(new SpanSection(text, stringBuilder.length(),styles)); 
     } 
     stringBuilder.append(text); 
     return this; 
    } 

    public SimpleSpanBuilder appendWithSpace(String text,CharacterStyle... styles){ 
     return append(text.concat(" "),styles); 
    } 

    public SimpleSpanBuilder appendWithLineBreak(String text,CharacterStyle... styles){ 
     return append(text.concat("\n"),styles); 
    } 

    public SpannableStringBuilder build(){ 
     SpannableStringBuilder ssb = new SpannableStringBuilder(stringBuilder.toString()); 
     for (SpanSection section : spanSections){ 
      section.apply(ssb); 
     } 
     return ssb; 
    } 

    @Override 
    public String toString() { 
     return stringBuilder.toString(); 
    } 
} 

Zastosowanie:

SimpleSpanBuilder ssb = new SimpleSpanBuilder(); 
ssb.appendWithSpace("Hello"); 
ssb.append("StackOverflow",new ForegroundColorSpan(Color.RED),new RelativeSizeSpan(1.5)); 
textView.setText(ssb.build()); 
+5

To jest rzeczywiście dobre rozwiązanie. +1 za wysiłek. –

+0

jak ustawić detektor kliknięcia w tekstach –

+0

@PrinkalKumar Wypróbuj zaktualizowaną odpowiedź za pomocą 'ClickableSpan' –