2013-02-20 37 views
33

Giả sử tôi có văn bản tiếp theo:Làm cách nào để đặt nhiều nhịp trên văn bản của TextView trên cùng một phần văn bản?

Xin chào Stackoverflow

Và tôi muốn thiết lập từ thứ hai là cả hai RelativeSizeSpan (để thiết lập một cỡ chữ tương đối) và TextAppearanceSpan (để thiết lập màu của văn bản), làm cách nào để hợp nhất cả hai?

Tất cả tôi biết là tôi có thể chọn một trong số họ, sử dụng mã sau ví dụ:

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

Nhưng tôi cũng cần phải thiết lập các màu sắc, hoặc thậm chí thêm các tính năng khác từ các lớp học kéo dài khác .. .

Tôi có thể làm gì?

+0

xem thêm https://stackoverflow.com/a/41953808 – Suragch

Trả lời

63

Chỉ cần thiết lập các nhịp bổ sung. Họ sẽ chồng chéo/hợp nhất khi cần thiết. Mã này hoạt động cho tôi:

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

gì là "3" cho? –

+6

số ngẫu nhiên tôi có trong đầu. Nó ở đây chỉ để cho thấy rằng bạn có thể có nhiều nhịp giao nhau với nhau – Zielony

+0

đây là câu trả lời nhanh nhất mà tôi đã có và được chọn là chính xác. chúc mừng ! –

27

Tôi biết câu trả lời mới này cho một câu hỏi đã được trả lời nhưng tôi muốn chia sẻ một lớp tiện ích mà tôi đã thực hiện.

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

Cách sử dụng:

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

Đây thực sự là một giải pháp tốt đẹp. 1 cho nỗ lực. –

+0

cách đặt trình nghe nhấp chuột trên văn bản –

+0

@PrinkalKumar Thử câu trả lời được cập nhật với 'ClickableSpan' –

Các vấn đề liên quan