Делаем текст жирным, курсивом и подчеркиванием с помощью динамической строки
В настоящее время я пытаюсь выяснить, как сделать текст жирным, курсивом или подчеркиванием с помощью динамической строки, поступающей из API, текст, который должен быть выделен жирным шрифтом, выглядит как * полужирный *, курсивом - _ italic_, а подчеркивание - #underline# (Та же функциональность, что и у Stackru). После успешного преобразования текста я хочу, чтобы специальные символы также были удалены.
Текст из API - * Я смелый * и люблю видеть _myself и _ других тоже.
Ожидаемый ответ - я смелый и люблю видеть себя и других тоже.
Я пробовал некоторый код, который не работает, если я пытаюсь создать курсив после полужирного, а также, если я пытаюсь удалить специальные символы.
TextView t = findViewById(R.id.viewOne);
String text = "*I am Bold* and _I am Italic_ here *Bold too*";
SpannableStringBuilder b = new SpannableStringBuilder(text);
Matcher matcher = Pattern.compile(Pattern.quote("*") + "(.*?)" + Pattern.quote("*")).matcher(text);
while (matcher.find()){
String name = matcher.group(1);
int index = text.indexOf(name)-1;
b.setSpan(new StyleSpan(Typeface.BOLD), index, index + name.length()+1, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);
}
t.setText(b);
Я не хочу использовать теги HTML
1 ответ
Отредактированный ответ для ответа на отредактированный вопрос
Попробуйте ниже, вы должны были пройти typeface
вместо StyleSpan
,
public class SpanTest extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
TextView test = findViewById(R.id.test);
// String text = "*I am Bold* and _I am Italic_ here *Bold too*";
String text = "* I am Bold* and love to see _myself and _ others too";
CharSequence charSequence = updateSpan(text, "*", Typeface.BOLD);
charSequence = updateSpan(charSequence, "_", Typeface.ITALIC);
test.setText(charSequence);
}
private CharSequence updateSpan(CharSequence text, String delim, int typePace) {
Pattern pattern = Pattern.compile(Pattern.quote(delim) + "(.*?)" + Pattern.quote(delim));
SpannableStringBuilder builder = new SpannableStringBuilder(text);
if (pattern != null) {
Matcher matcher = pattern.matcher(text);
int matchesSoFar = 0;
while (matcher.find()) {
int start = matcher.start() - (matchesSoFar * 2);
int end = matcher.end() - (matchesSoFar * 2);
StyleSpan span = new StyleSpan(typePace);
builder.setSpan(span, start + 1, end - 1, 0);
builder.delete(start, start + 1);
builder.delete(end - 2, end - 1);
matchesSoFar++;
}
}
return builder;
}
}
Вот выход.