Как удалить стиль span из SpannableString

Я пытался удалить стиль из моего SpannableString, но, к сожалению, это не работает, моя цель - удалить стиль, когда я нажимаю на текст.

SpannableString content = new SpannableString("Test Text");
content.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, content.length(), 0);
...

Действие по клику:

content.removeSpan(new StyleSpan(Typeface.BOLD_ITALIC)) // not working

person SingaCpp    schedule 05.11.2015    source источник


Ответы (2)


Два новых styleSpan — это не один и тот же объект. Вы можете использовать неанонимный объект, чтобы указать на него. Измените свой код следующим образом:

StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC); content.setSpan(styleSpan , 0, content.length(), 0);

Действие по клику:

content.removeSpan(styleSpan);
textView.setText(content);// to redraw the TextView
person Zheng Xingjie    schedule 05.11.2015

Как указал Чжэн Синцзе, вы можете удалить конкретный диапазон с помощью removeSpan(), но вам нужно сохранить объект диапазона.

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

В моем случае это было BackgroundColorSpan, но я буду использовать StyleSpan, как было задано:

Ява

SpannableString content = new SpannableString("Test Text");
content.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, content.length(), 0);
StyleSpan[] spans = content.getSpans(0, content.length(), StyleSpan.class);
for (StyleSpan styleSpan: spans) content.removeSpan(styleSpan);
textview.setText(content);

Котлин

val content = SpannableString("Test Text")
content.setSpan(StyleSpan(Typeface.BOLD_ITALIC), 0, content.length, 0)
val spans = content.getSpans(0, content.length, StyleSpan::class.java)
for (styleSpan in spans) content.removeSpan(styleSpan)
textview.setText(content)
person Zain    schedule 26.04.2021