Задание зачеркивания в разделе текста TextView. - PullRequest
29 голосов
/ 29 ноября 2010

У меня есть блок текста, поступающий из веб-службы, и в зависимости от некоторых тегов, которые я предопределил, я хочу стилизовать текст перед установкой его в TextView.Для жирного, курсива и подчеркивания я смог легко это сделать с помощью команды replaceAll:

PageText = PageText.replaceAll("\\*([a-zA-Z0-9]+)\\*", "<b>$1</b>");
        PageText = PageText.replaceAll("=([a-zA-Z0-9]+)=", "<i>$1</i>");            
        PageText = PageText.replaceAll("_([a-zA-Z0-9]+)_", "<u>$1</u>");
txtPage.setText(Html.fromHtml(PageText), TextView.BufferType.SPANNABLE);

Итак, чтобы выделить слово жирным шрифтом, окружите его *, курсивом - _.

Но для зачеркивания Html.fromHtml не поддерживает тег «strike», поэтому его нельзя сделать таким же образом.Я видел примеры использования Spannable для установки стиля в одном разделе текста, но это требует позиционных чисел.Итак, я думаю, я мог бы пройтись по тексту, выполнив поиск - (тег для представления удара), затем выполнив поиск следующего, охватывая текст между ними и повторив для всех таких строк.В конечном итоге это будет 10 строк зацикливания кода, а не 1 для остальных, поэтому мне интересно, есть ли более элегантное решение.

Ответы [ 6 ]

93 голосов
/ 29 ноября 2010

Если это просто TextView, вы можете использовать флаги рисования

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
30 голосов
/ 25 сентября 2014

@ Решение Suresh работает, если вы хотите зачеркнуть весь TextView, но если вы хотите зачеркнуть только некоторые части текста, используйте код ниже.

    tvMRP.setText(text, TextView.BufferType.SPANNABLE);
    Spannable spannable = (Spannable) tvMRP.getText();
    spannable.setSpan(new StrikethroughSpan(), 3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Здесь text - это текст, которыймы хотим, чтобы TextView отображался, 3 - это нет.символов (начиная с 0), откуда начнется зачеркивание.

1 голос
/ 23 сентября 2015

Вы можете сделать это с помощью пользовательского TagHandler, например, в этом вопросе SO :

Spanned parsed = Html.fromHtml(PageText, null, new MyHtmlTagHandler());

И TagHandler реализует методы:

public void handleTag(boolean opening, String tag, Editable output,
        XMLReader xmlReader) {
    if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
        processStrike(opening, output);
    }
}
....
1 голос
/ 17 мая 2013

Вот решение с использованием пользовательского TagHandler, который вы должны передать Html.fromHtml ().

Android: как использовать Html.TagHandler?

0 голосов
/ 22 сентября 2011

Похоже, что на самом деле не поддерживается, по крайней мере, это не работает на Android 3.1.

@ RMS2, если текст маленький, вы можете разделить его на два или три отдельных текстовых представления и установить флаг толькотот, который вы хотите, не идеально подходит для длинных текстов; (

0 голосов
/ 26 мая 2011

Вы уверены, что Html.fromHtml не поддерживает <strike>? Это перечислено в этом сообщении блога Commonsware

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...