我试图在EditText控件中呈现HTML字符串。粗体、斜体和下划线HTML正确呈现,但是删除线被忽略。
这是edittext控件,没什么特别的:

<EditText
        android:id="@+id/rich_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Widget.EditText"
        android:gravity="top"
        android:inputType="textFilter|textMultiLine|textNoSuggestions"
        android:minLines="8"
        android:textStyle="normal" />

下面是在edittext控件中设置html的代码:
var textView = view.FindViewById<EditText> (Resource.Id.rich_text);
var html = "<b>bold test</b> <u>underline test</u> <i>italic test</i> <strike>strike test 1</strike> <del>strike test 2</del> <s>strike test 3</s>";
textView.TextFormatted = Html.FromHtml (html);

下面是一个屏幕截图,显示了它的显示方式,请注意strike-through测试是如何不起作用的。
android - 使用TextFormatted在EditText中使用strike html标记进行渲染-LMLPHP
你知道我做错了什么吗?

最佳答案

这就是我解决问题的方法。我创建了一个Itaghandler的实现:

public class HtmlTagHandler : Object, Html.ITagHandler {
        public void HandleTag (bool opening, string tag, IEditable output, IXMLReader xmlReader) {
            if (tag == "strike" || tag == "s" || tag == "del") {
                var text = output as SpannableStringBuilder;
                if (opening)
                    Start (text, new Strike ());
                else
                    End (text, Class.FromType (typeof(Strike)), new StrikethroughSpan ());
            }
        }

        private static void Start (SpannableStringBuilder text, Object mark) {
            var length = text.Length ();
            text.SetSpan (mark, length, length, SpanTypes.MarkMark);
        }

        private static void End (SpannableStringBuilder text, Class kind, Object newSpan) {
            var length = text.Length ();
            var span = GetLast (text, kind);
            var where = text.GetSpanStart (span);
            text.RemoveSpan (span);
            if (where != length)
                text.SetSpan (newSpan, where, length, SpanTypes.ExclusiveExclusive);
        }

        private static Object GetLast (ISpanned text, Class kind) {
            var length = text.Length ();
            var spans = text.GetSpans (0, length, kind);
            return spans.Length > 0 ? spans.Last () : null;
        }
    }

    class Strike : Object {
    }

可以这样称呼:
public static ISpanned ToHtml (this string html) {
            return Html.FromHtml (html ?? string.Empty, null, new HtmlTagHandler ());
        }

下面是它的外观:
android - 使用TextFormatted在EditText中使用strike html标记进行渲染-LMLPHP

10-08 13:46
查看更多