android - 如何使用 MutableLiveData 进行数据绑定和带有 android:enabled 的按钮?
问题描述
我有一个注册表,我有很大的条件可以继续。为简单起见,我有一个editText
和一个Button
。我用 MVVM 编写,所以我有一个ViewModel()
存储位置
val stroke = MutableLiveData<String>()
。因此,当行程长度大于 5 时,必须激活按钮。我这样做: Activity 'class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
binding.setLifecycleOwner(this)
binding.model = viewModel
}}
查看模型
class MainViewModel: ViewModel(){
val stroke = MutableLiveData<String>()
val enableButton = MutableLiveData<Boolean>()
get(){
field.value = (stroke.value ?: "").length > 5
return field
}}
xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="model"
type="nekono.inno.mvvmsample.MainViewModel"/>
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="textPersonName"
android:text="@={model.stroke}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="49dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:enabled="@{model.enableButton}"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText" />
</android.support.constraint.ConstraintLayout>
</layout>
似乎 enabled 仅在绑定时询问变量,之后它停止询问并保持绑定时的状态。如何解决这个问题?
解决方案
您可以在中风上使用 Transformations 来实现这一点。
val stroke = MutableLiveData<String>()
val enableButton: LiveData<Boolean> = Transformations.map(stroke) { it.length > 5 }
当stroke
改变时,enableButton
值也会改变
推荐阅读
- java - 有没有 vmlens 的替代品来帮助检测竞争条件?
- php - 将变量产品添加到全局允许延期交货命令
- python - Python 正则表达式命名捕获组
- scala - 如何修改由cmd sbt包生成的jar名称
- matlab - 如何在matlab中找到波浪高度快速变化的时间?
- python - 在 Pandas 中合并列中的行中的字符串
- airflow - 气流池使用的插槽大于插槽限制
- php - 为什么我的 Python 代码比 PHP 中的相同代码慢 100 倍?
- python - 摆脱尾随转义字符的简单方法
- swift - Audiokit 日志记录 - 55: EXCEPTION (-1): "" - 重复