Подтвердить что ты не робот

Указание "зачеркивания" в разделе текста TextView

У меня есть блок текста, исходящий из веб-сервиса, и в зависимости от некоторых тегов, которые я предопределл, я хочу стилизовать текст, прежде чем устанавливать его в свой 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);

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

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

4b9b3361

Ответ 1

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

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Ответ 2

Решение

@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 - это no. символов (начиная с 0), с которого начнется зачеркивание.

Ответ 4

Вы можете сделать это с помощью настраиваемого 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);
    }
}
....

Ответ 6

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

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