Intereting Posts

Как установить несколько интервалов текста TextView на один и тот же частичный текст?

Предположим, у меня есть следующий текст:

Привет, stackOverflow

И я хочу установить второе слово как RelativeSizeSpan (чтобы установить относительный размер шрифта), так и TextAppearanceSpan (чтобы установить цвет текста), как мне их объединить?

Все, что я знаю, это то, что я могу выбрать один из них, используя следующий код, например:

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

Но мне нужно также установить цвет или даже добавить другие функции из других классов spanning …

Что я могу сделать ?

Solutions Collecting From Web of "Как установить несколько интервалов текста TextView на один и тот же частичный текст?"

Просто установите дополнительные промежутки. Они будут перекрываться / сливаться, когда это необходимо. Этот код работает для меня:

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

Я знаю, что это новый ответ на уже ответивший вопрос, но я хотел бы поделиться классом утилиты, который я сделал, что облегчает эту задачу.

 public class SimpleSpanBuilder { private class SpanSection{ private final String text; private final int startIndex; private final ParcelableSpan[] spans; public SpanSection(String text, int startIndex,ParcelableSpan... spans){ this.spans = spans; this.text = text; this.startIndex = startIndex; } public void apply(SpannableStringBuilder spanStringBuilder){ if (spanStringBuilder == null) return; for (ParcelableSpan span : spans){ spanStringBuilder.setSpan(span, 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,ParcelableSpan... spans){ if (spans != null && spans.length > 0) { spanSections.add(new SpanSection(text, stringBuilder.length(),spans)); } stringBuilder.append(text); return this; } 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(); } } 

Применение:

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