为什么我的EditText数据绑定不起作用?

问题描述 投票:0回答:2

我有用于教室的此类:

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的text属性之前记录了它。

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

为什么不一开始就设置正确?

android android-databinding android-livedata android-viewmodel
2个回答
1
投票

Databinding不应与View binding

像指南中一样,使EditPieceViewModel实现可观察并且使form.title @Bindable。


0
投票

现在可以了。我仍然不完全了解Databinding库,因此欢迎提出任何改进代码的建议!

我更改了ViewModel以实现Observable并向其中添加了一些方法:

// Make sure to import the correct Observable interface
import androidx.databinding.Observable
// ...

class EditPieceViewModel(...) : AndroidViewModel(application), Observable {

   // ...

   // New getter and setter methods for my title field:

    @Bindable
    fun getTitle() : String {
        return form.title
    }

    fun setTitle(value: String) {
        if(form.title != value) {
            form.title = value
            notifyPropertyChanged(BR.title) // This line is important for EditText' value to update
        }
    }


   // New methods added for Observable:

    override fun addOnPropertyChangedCallback(
        callback: Observable.OnPropertyChangedCallback) {
        callbacks.add(callback)
    }

    override fun removeOnPropertyChangedCallback(
        callback: Observable.OnPropertyChangedCallback) {
        callbacks.remove(callback)
    }

    /**
     * Notifies observers that a specific property has changed. The getter for the
     * property that changes should be marked with the @Bindable annotation to
     * generate a field in the BR class to be used as the fieldId parameter.
     *
     * @param fieldId The generated BR id for the Bindable field.
     */
    fun notifyPropertyChanged(fieldId: Int) {
        callbacks.notifyCallbacks(this, fieldId, null)
    }

}

在布局xml中,我更改标题以观察viewModel.title而不是viewModel.form.title:

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

最后在updateInputValues中,我称呼我的自定义设置器:

fun updateInputValues(piece: Piece) {
        setTitle(piece.title)
}
© www.soinside.com 2019 - 2024. All rights reserved.