2016-01-21 61 views
3

我试图在EditText控件中呈现一个html字符串。粗体,斜体和下划线html可以正确呈现,但是穿透只会被忽略。罢工HTML标记不在EditText中使用TextFormatted呈现

这里是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" /> 

这里是设置在HTML中的EditText控件的代码:

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); 

这里是怎么了显示器的屏幕截图,请注意通过测试的方法无效。

enter image description here

任何想法我做错了吗?

回答

3

<strike>不支持。我无法找到所有支持的HTML标记列表的官方文档。但是,如果您查看源代码,您将无法在其中找到支持。

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/text/Html.java

我可以收集以下标签的支持:

Tags    Format 
b, strong   Bold 
i, em, cite, dfn Italics 
u     Underline 
sub     Subtext 
sup     Supertext 
big     Big 
small    Small 
tt     Monospace 
h1 … h6    Headlines 
img     Image 
font    Font face and color 
blockquote   For longer quotes 
a     Link 
div, p    Paragraph 
br     Linefeed 
5

这里是我解决了这个问题。我创建了一个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()); 
     } 

这里是它的外观:

enter image description here

+0

正是由于这个代码的未来用户。在这种情况下,Object是Java.Lang.Object。 – Cheesebaron