首页 > 解决方案 > 为什么我与 EditText 的数据绑定不起作用?

问题描述

我有这个用于 Room 的课程:

data class Piece(
    @ColumnInfo(name = "title")
    var title: String
)

然后我有一个表单类,它只保存我想要显示的字符串值EditText

class CreateEditPieceForm {
    var title: String = ""
}

我的 ViewModel 包含这些类的实例:

class EditPieceViewModel(...) : AndroidViewModel(application) {
    val piece : LiveData<Piece?> = database.getMyPiece() // valid Piece with title set
    val form = CreateEditPieceForm()
}

在我的片段中,我观察到这幅作品:

viewModel.piece.observe(this, Observer {piece ->
   piece?.let {
       viewModel.updateInputValues(piece)
    }
})

ViewModel 中的 updateInputValues 函数简单地设置表单中的值:

   fun updateInputValues(piece: Piece) {
        Log.d("mylog", "value: " + piece.title) // logs correct value
        form.title = piece.title // setting this does not change EditText
   }

最后,在我的布局中,我尝试使用数据绑定在 EditText 中显示 form.title 中的文本:

<data>

  <variable
            name="viewModel"
            type="com.example.tutorial.createedit.CreateEditPieceViewModel" />

</data>

<!-- ... -->

  <EditText
            android:id="@+id/input_title"
            <!-- ... -->
            android:inputType="text"

            android:text="@={viewModel.form.title}" />

当我用这个片段打开屏幕时,EditText 是空的。我知道对片名的查询是正确的,因为我在设置 EditText 的文本属性之前记录了它。

当我在空字段中输入内容时viewModel.form.title,将使用该值设置值。

为什么一开始就没有设置好?

标签: androidandroid-databindingandroid-livedataandroid-viewmodel

解决方案


不要将数据绑定视图绑定混淆。

就像在指南中一样,让 EditPieceViewModel 实现 Observable 并让form.title@Bindable。


推荐阅读