Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Как задать фон и цвет шрифта части текста в TextView на Андроид используя Html.TagHandler для неподдерживаемых HTML тэгов?

#java #android #android_textview


Дано:

Есть HTML код, в нём текст, в тексте код, заключённый в тэг Тут код. 

Задача:

Текст внутри тэга должен иметь нужный мне цвет и определённого цвета фон.

Вопрос: 

Как этого добиться, если учесть, что текст назначается (и должен продолжать назначаться)
TextView так:

textView.setText(Html.fromHtml(myAwesomeTextWithCode));

    


Ответы

Ответ 1



Для обработки неподдерживаемых тэгов надо передавать в качестве 3 аргумента метода Html.fromHtml экземпляр класса, расширяющего Html.TagHandler, в коем и будет происходить обработка всех неподдерживаемых на Android HTML тэгов: public class MyHtmlTagHandler implements TagHandler { @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { if (tag.equalsIgnoreCase("code")) { processCode(opening, output); } } private void processCode(boolean opening, Editable output) { int len = output.length(); if (opening) { output.setSpan(new ForegroundColorSpan(Color.RED), len, len, Spanned.SPAN_MARK_MARK); output.setSpan(new BackgroundColorSpan(Color.GREEN), len, len, Spanned.SPAN_MARK_MARK); } else { Object obj = getLast(output, BackgroundColorSpan.class); int where = output.getSpanStart(obj); output.removeSpan(obj); if (where != len) { output.setSpan(new ForegroundColorSpan(Color.RED), where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); output.setSpan(new BackgroundColorSpan(Color.GREEN), where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } } private static Object getLast(Spanned text, Class kind) { /* * This knows that the last returned object from getSpans() * will be the most recently added. */ Object[] objs = text.getSpans(0, text.length(), kind); if (objs.length == 0) { return null; } return objs[objs.length - 1]; } } Т.е. теперь вы можете сделать так: String myAwesomeTextWithCode = "

некод-некод Тут код опять-не-код

"; textView.setText(Html.fromHtml(myAwesomeTextWithCode, null, new MyHtmlTagHandler()));

Комментариев нет:

Отправить комментарий