Android TextView加载HTML有序列表显示为圆点无序列表问题求助
问题核心原因
Android 原生HtmlCompat的默认标签解析器对<ol>有序列表的支持存在原生缺陷,所有<li>标签无论父节点是有序列表还是无序列表,默认都会统一渲染为圆点前缀,不会自动生成递增的数字序号,这是渲染效果不符合预期的根本原因。
修复方案
- 自定义
Html.TagHandler实现,单独处理<ol>和<li>标签的序号计数逻辑,覆盖系统默认的列表渲染规则 - 调用
HtmlCompat.fromHtml方法时,将自定义TagHandler作为参数传入
核心实现代码
1. 自定义有序列表标签处理器
import android.text.Editable import android.text.Html import org.xml.sax.XMLReader import java.util.Stack class OrderedListTagHandler : Html.TagHandler { private var olLevel = 0 private val indexStack = Stack<Int>() override fun handleTag( opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader ) { when (tag.lowercase()) { "ol" -> { if (opening) { olLevel += 1 indexStack.push(1) } else { olLevel -= 1 indexStack.pop() } } "li" -> { if (opening) { if (olLevel > 0) { val currentNum = indexStack.peek() output.append("$currentNum. ") indexStack.push(indexStack.pop() + 1) } else { output.append("• ") } } else { output.append("\n") } } } } }
2. 修改HtmlCompat调用逻辑
dataBinding.tvBody.text = HtmlCompat.fromHtml( text, HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_DIV, null, OrderedListTagHandler() )
上述实现可直接覆盖当前传入的单层有序列表场景,渲染后会自动生成1.、2.、3.、4.格式的序号前缀。如果存在多层嵌套列表需求,可在处理器中新增
<ul>层级计数逻辑,按需区分不同层级的序号、前缀样式即可。
内容的提问来源于stack exchange,提问作者Sakhawat Hossain
相关产品推荐
相关产品推荐

