You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用DataBinding实现TextView文本删除线效果?

问题解答

结论

可以完全通过纯DataBinding实现该效果,不需要自定义适配器;也可以通过BindingAdapter封装实现更易复用的写法,两种方案都可行。

方案1:纯DataBinding实现(无需额外代码)

  • 首先在布局的<data>标签中导入Paint类,同时声明绑定的数据源变量:
<data>
    <import type="android.graphics.Paint" />
    <variable
        name="task"
        type="你的Task实体类完整路径" />
</data>
  • 给TextView设置paintFlags属性,通过三元表达式根据task.completed的值动态修改删除线标记:
<TextView
    android:id="@+id/textViewName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{task.name}"
    android:paintFlags="@{task.completed ? (textViewName.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG) : (textViewName.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG)}" />
  • 给CheckBox设置双向绑定,同步勾选状态到task.completed,实现状态变化自动联动TextView效果:
<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="@={task.completed}" />

说明:表达式里的textViewName是TextView的id,DataBinding会自动生成对应的实例引用,可以直接在表达式中调用其方法。

方案2:BindingAdapter封装实现(推荐多场景复用)

如果多个页面都需要用到删除线效果,可以自定义BindingAdapter统一封装,用法更简洁:

  • 首先编写BindingAdapter扩展方法:
import android.widget.TextView
import androidx.databinding.BindingAdapter

@BindingAdapter("strikeThruText")
fun TextView.setStrikeThruText(isCompleted: Boolean) {
    paint.isStrikeThruText = isCompleted
}
  • 布局中直接调用自定义属性即可:
<TextView
    android:id="@+id/textViewName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{task.name}"
    app:strikeThruText="@{task.completed}" />

CheckBox的双向绑定写法和方案1完全一致。

内容的提问来源于stack exchange,提问作者MaYar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:06:04