Ниже утилита класс, чтобы сделать spannable строки с требуемым форматированиемspannableStringBuilder не работает с несколько пролетом в одном текстовом
package impressico.com.testfragmentstack;
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import java.util.ArrayList;
import java.util.List;
public class SimpleSpanBuilder {
public static final int FORMATTING_STYLE_DARK_BOLD = 1;
public static final int FORMATTING_STYLE_DARK_BOLD_SMALL = 2;
public static final int FORMATTING_STYLE_DIM_ITALIC_LIGHT = 3;
public static final int FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL = 4;
private List<SpanSection> spanSections;
private StringBuilder stringBuilder;
ForegroundColorSpan boldColorSpan;
ForegroundColorSpan dimColorSpan;
ForegroundColorSpan testColorSpan1;
ForegroundColorSpan testColorSpan2;
RelativeSizeSpan relativeSmallSpan;
public SimpleSpanBuilder(Context context) {
stringBuilder = new StringBuilder();
spanSections = new ArrayList<>();
boldColorSpan =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Green));
dimColorSpan =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Blue));
testColorSpan1 =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Black));
testColorSpan2 =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Red));
relativeSmallSpan = new RelativeSizeSpan(0.8f);
}
public SimpleSpanBuilder append(String text, int formattingStyle) {
spanSections.add(new SpanSection(text, stringBuilder.length(), formattingStyle));
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();
}
private class SpanSection {
private final String text;
private final int startIndex;
private final int formattingStyle;
public SpanSection(String text, int startIndex, int formattingStyle) {
this.formattingStyle = formattingStyle;
this.text = text;
this.startIndex = startIndex;
}
public void apply(SpannableStringBuilder spanStringBuilder) {
if (spanStringBuilder == null) return;
switch (formattingStyle) {
case FORMATTING_STYLE_DARK_BOLD:
spanStringBuilder.setSpan(boldColorSpan, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
break;
case FORMATTING_STYLE_DARK_BOLD_SMALL:
spanStringBuilder.setSpan(testColorSpan1, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
break;
case FORMATTING_STYLE_DIM_ITALIC_LIGHT:
spanStringBuilder.setSpan(dimColorSpan, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
break;
case FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL:
spanStringBuilder.setSpan(testColorSpan2, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
break;
}
}
}
}
Когда я пытаюсь применить форматирование на пролет ниже вызывающий код его не работает, как ожидаемый
tv=((TextView) view.findViewById(R.id.fragment_title));
SimpleSpanBuilder ssbTest=new SimpleSpanBuilder(getContext());
ssbTest.append("Green",1);
ssbTest.append("Black",2);
ssbTest.append("Blue",3);
ssbTest.append("Red",4);
ssbTest.append("Green",1);
ssbTest.append("Black",2);
ssbTest.append("Blue",3);
ssbTest.append("Red",4);
tv.setText(ssbTest.build());
кто-то пожалуйста, помогите мне, чтобы выяснить, что случилось в этом или его ошибка, из spannable ул ING/TextView?
Обновление Благодаря @TdSoft для решения и @WKS здесь причина, чтобы расширить ваш код
case FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL: {
CalligraphyTypefaceSpan typefaceSemiBoldItalic = new CalligraphyTypefaceSpan(typefaceSBI);
ForegroundColorSpan dimColorSpan =
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.text_color_ffa7acb3));
RelativeSizeSpan relativeSmallSpan = new RelativeSizeSpan(0.8f);
spanStringBuilder.setSpan(typefaceSemiBoldItalic, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spanStringBuilder.setSpan(dimColorSpan, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spanStringBuilder.setSpan(relativeSmallSpan, startIndex, startIndex + text.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
break;
У меня есть требование фиксированного набора стиля форматирования, выше кода вызывается во многих местах поэтому лучше показать код форматирования вызывающим абонентам.
его работает нормально, это означает, что мы не можем повторно использовать экземпляр стиля форматирования дважды во время сборки SpannableString, не так ли? – RQube
@RQube да, это правильно ... :) – TdSoft