如何使用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
相关产品推荐
相关产品推荐

