2013-02-20 14 views
33

Angenommen, ich den nächsten Text haben:Wie legen Sie mehrere Bereiche in einem TextView-Text auf demselben Teiltext fest?

Hallo Stackoverflow

Und ich wünschte, das zweite Wort setzen beide RelativeSizeSpan zu sein (eine relative Schriftgröße einzustellen) und TextAppearanceSpan (um die Farbe einzustellen des Textes), wie füge ich sie beide zusammen?

Alles was ich weiß ist, dass ich einen von ihnen wählen kann, den nächsten Code zum Beispiel mit:

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

Aber ich muß auch die Farbe einstellen, oder auch andere Funktionen aus anderen Spanning Klassen hinzufügen .. .

Was kann ich tun?

+0

siehe auch https://stackoverflow.com/a/41953808 – Suragch

Antwort

63

Einfach zusätzliche Spannen einstellen. Sie werden sich bei Bedarf überschneiden/zusammenführen. Dieser Code funktioniert für mich:

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

was ist die "3" für? –

+6

Zufallszahl, die ich in meinem Kopf hatte. Es ist hier nur um zu zeigen, dass Sie mehrere Spannen haben können, die sich schneiden – Zielony

+0

das ist bei weitem die schnellste Antwort, die ich habe und als die richtige ausgewählt. Glückwunsch ! –

27

Ich weiß, dass dies eine neue Antwort auf eine bereits beantworteten Frage, aber ich mag eine Utility-Klasse teilen, die ich gemacht, die diese Aufgabe erleichtern.

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

Verbrauch:

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

Dies ist eigentlich eine nette Lösung. +1 für die Mühe. –

+0

wie man Klick Listener auf Texte setzen –

+0

@PrinkalKumar Versuchen Sie die aktualisierte Antwort mit 'ClickableSpan' –