首页 > 解决方案 > 如何使用 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 仅在绑定时询问变量,之后它停止询问并保持绑定时的状态。如何解决这个问题?

标签: androiddata-binding

解决方案


您可以在中风上使用 Transformations 来实现这一点。

val stroke = MutableLiveData<String>()
val enableButton: LiveData<Boolean> = Transformations.map(stroke) {  it.length > 5 }

stroke改变时,enableButton值也会改变


推荐阅读