能否在Android DataBinding中使用Kotlin扩展函数实现富文本渲染?
可以直接通过Kotlin扩展函数实现该需求,不过你当前的扩展函数存在逻辑遗漏,需要先修复再配合DataBinding配置即可正常调用。
第一步:修复现有扩展函数
你当前的代码仅生成了富文本Spanned对象,没有赋值给当前TextView的text属性,也没有做空安全和弃用注解压制,修正后代码如下:
fun TextView.htmlText(txt: String?) { txt ?: return text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Html.fromHtml(txt, Html.FROM_HTML_MODE_COMPACT) } else { @Suppress("DEPRECATION") Html.fromHtml(txt) } }
第二步:适配DataBinding调用
提供两种常用方案,推荐使用方案1更简洁:
方案1:添加BindingAdapter注解(推荐)
给扩展函数加上@BindingAdapter注解,即可直接作为自定义属性在布局中使用,修改后的扩展函数:
import androidx.databinding.BindingAdapter @BindingAdapter("htmlText") fun TextView.htmlText(txt: String?) { txt ?: return text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Html.fromHtml(txt, Html.FROM_HTML_MODE_COMPACT) } else { @Suppress("DEPRECATION") Html.fromHtml(txt) } }
在布局中直接替换原有android:text属性即可,需确保根布局已声明app命名空间xmlns:app="http://schemas.android.com/apk/res-auto":
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" app:htmlText="@{model.text}" />
方案2:直接导入扩展函数静态类调用
如果不想添加BindingAdapter注解,也可以直接导入Kotlin扩展函数生成的静态类在布局中调用:
首先在布局的<data>标签中导入扩展函数所在文件生成的静态类,假设你的扩展函数写在TextViewExt.kt文件中,包名为com.your.project,导入写法如下:
<data> <import type="com.your.project.TextViewExtKt" /> <variable name="model" type="com.your.project.YourViewModel" /> </data>
然后直接在TextView的text属性中调用静态方法即可:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{TextViewExtKt.htmlText(model.text)}" />
注意事项
- 需提前在模块级
build.gradle中开启DataBinding开关:android { buildFeatures { dataBinding true } } - 该实现仅支持基础的HTML标签(如
<b>、<i>、<font>等)渲染,若需要支持图片、超链接点击等能力,需要额外对Html.fromHtml的参数做扩展配置。 - 若HTML内容包含特殊字符,需要提前做转义处理避免渲染异常。
内容的提问来源于stack exchange,提问作者Anu
相关产品推荐
相关产品推荐

