Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android HtmlCompat.toHtml(span)返回嵌套不正确的HTML标记_Android_Html_Android Edittext_Fromhtml - Fatal编程技术网

Android HtmlCompat.toHtml(span)返回嵌套不正确的HTML标记

Android HtmlCompat.toHtml(span)返回嵌套不正确的HTML标记,android,html,android-edittext,fromhtml,Android,Html,Android Edittext,Fromhtml,我有一个Edittext(binding.text使用视图绑定),其中包含使用样式跨度(即粗体和斜体)设置样式的文本。为了保存格式化文本,我在Kotlin中使用HtmlCompat.toHtml(spannable)将其转换为HTML var htmlString = HtmlCompat.toHtml(SpannableString(binding.text.text), HtmlCompat.FROM_HTML_MODE_LEGACY) 但是,如果文本同时应用了粗体和斜体,则返回的HTML

我有一个Edittext(binding.text使用视图绑定),其中包含使用样式跨度(即粗体和斜体)设置样式的文本。为了保存格式化文本,我在Kotlin中使用HtmlCompat.toHtml(spannable)将其转换为HTML

var htmlString = HtmlCompat.toHtml(SpannableString(binding.text.text), HtmlCompat.FROM_HTML_MODE_LEGACY)
但是,如果文本同时应用了粗体和斜体,则返回的HTML嵌套不正确

  • Hello World:输出

    你好世界


  • Hello World:输出
    关于排序,您是对的,尽管HTML仍应在浏览器中正确显示。有问题的代码在Html.java中。以下是
    的翻译:

    。。。
    对于(int j=0;j=0;j--){
    ,,,
    if(style[j]实例of StyleSpan){
    ints=((StyleSpan)style[j]).getStyle();
    如果((s&Typeface.BOLD)!=0){
    out.追加(“”);
    }
    如果((s&Typeface.ITALIC)!=0){
    out.追加(“”);
    }
    }
    
    style
    是一个跨距数组。此代码向前扫描跨距以放置开始标记,向后扫描以关闭标记。因此,如果粗体跨距和斜体跨距是跨越相同文本的不同跨距,则此代码将生成正确嵌套的标记

    但是,如果一个StyleSpan同时指定斜体和粗体,则标记顺序将与您报告的一样。输出结束标记的代码应将
    放在
    b
    之前。这看起来像是一个错误,应该报告


    我假设您有一个粗体斜体的span样式。解决方法是将该span拆分为两个单独的span-粗体span和斜体span。然后代码应按预期工作。

    是的,这就是实际情况!我使用粗体斜体span,因为我认为它比两个单独的span更干净,但现在我知道了bett呃。非常感谢你的指导:)@TongJingYen你所做的应该是可以的,我也会这么做。这是Html.java代码中的一个bug。我将报告它并链接到这篇文章。@TongJingYen这是最新的。谢谢你的报告。我可以在其中添加一个截图作为评论吗?@TongJingYen我想可以。
    ...
    for (int j = 0; j < style.length; j++) {    
        ...
        if (style[j] instanceof StyleSpan) {
            int s = ((StyleSpan) style[j]).getStyle();
        
            if ((s & Typeface.BOLD) != 0) {
                out.append("<b>");
            }
            if ((s & Typeface.ITALIC) != 0) {
                out.append("<i>");
            }
        }
    
    ...
    for (int j = style.length - 1; j >= 0; j--) {
        ,,,
        if (style[j] instanceof StyleSpan) {
            int s = ((StyleSpan) style[j]).getStyle();
        
            if ((s & Typeface.BOLD) != 0) {
                out.append("</b>");
            }
            if ((s & Typeface.ITALIC) != 0) {
                out.append("</i>");
            }
        }