通过双向数据绑定实现EditText减法结果展示到TextView是否可行
问题解答
完全可以,双向数据绑定非常适合实现这类输入实时联动计算的需求,相比给每个EditText手动注册TextWatcher的传统实现,代码耦合度更低,冗余代码更少。实现步骤如下:
- 首先在模块级
build.gradle配置中开启数据绑定支持:
android { // 其他配置项省略 buildFeatures { dataBinding true } }
- 编写业务承载的ViewModel类,用可观察字段存储两个输入值与计算结果,给两个输入字段添加变更监听,任意一个输入值变动时自动触发减法计算,更新结果字段:
class CalcViewModel : ViewModel() { // 双向绑定对应的两个输入值字段 val inputNum1 = ObservableField<String>() val inputNum2 = ObservableField<String>() // 结果展示字段 val calcResult = ObservableField<String>() init { // 统一的数值变更回调,触发计算逻辑 val valueChangeCallback = object : Observable.OnPropertyChangedCallback() { override fun onPropertyChanged(sender: Observable?, propertyId: Int) { doSubtractCalc() } } inputNum1.addOnPropertyChangedCallback(valueChangeCallback) inputNum2.addOnPropertyChangedCallback(valueChangeCallback) } private fun doSubtractCalc() { // 空值、非法值兜底,默认按0处理 val num1 = inputNum1.get()?.toDoubleOrNull() ?: 0.0 val num2 = inputNum2.get()?.toDoubleOrNull() ?: 0.0 calcResult.set("计算结果:${num1 - num2}") } }
- 改写对应页面的XML布局,最外层用
layout标签包裹,声明数据节点绑定上述ViewModel;两个EditText用@={}双向绑定语法关联输入字段,TextView单向绑定结果字段即可:
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="calcVm" type="替换为你自己的ViewModel全类名路径.CalcViewModel" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入被减数" android:inputType="numberDecimal" android:text="@={calcVm.inputNum1}" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:hint="请输入减数" android:inputType="numberDecimal" android:text="@={calcVm.inputNum2}" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:textSize="18sp" android:text="@{calcVm.calcResult}" /> </LinearLayout> </layout>
- 最后在对应的Activity/Fragment中完成数据绑定初始化,传入ViewModel实例即可。运行后修改任意一个输入框的数值,减法结果都会实时同步到TextView上。
注意:给EditText设置numberDecimal输入类型可以减少用户输入非数字内容的概率,代码中用toDoubleOrNull()做了异常兜底,就算用户临时输入非法内容也不会触发崩溃。
内容的提问来源于stack exchange,提问作者charbs29
相关产品推荐
相关产品推荐

