如何在 Android Studio 中设置数据绑定的默认值?

How can I set default value for data binding in Android Studio?

我在fire Code A前给变量playState赋值了,但是Code A还是报如下错误信息

方法kotlin.jvm.internal.Intrinsics.checkNotNullParameter,参数aEPlayState

我认为playState是一个LiveData,初始值为null,可能会导致赋值前出错

我该如何解决?代码 B 正确吗?

代码A

<?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">

    <data>
        <import type="android.view.View" />
        <import type="androidx.lifecycle.LiveData" />
        <import type="info.dodata.voicerecorder.model.EPlayState" />
      
        <variable
            name="playState"
            type="LiveData&lt;EPlayState>" />
      
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"      
        android:orientation="vertical">

            <ImageButton
                android:id="@+id/btnPlay"
                android:layout_width="@dimen/round_button_small"
                android:layout_height="@dimen/round_button_small"  
                app:srcCompat="@drawable/play_play"
                app:iamgeForPlayPause="@{playState}"
                
            />
     </LinearLayout>

</layout>


@BindingAdapter("app:iamgeForPlayPause")
fun imageForPlayPause(aImageButton: ImageButton, aEPlayState: EPlayState) {
    ...
}

enum class EPlayState {
    STOPPED,
    PLAYING,
    PAUSED
}

代码B

<variable
   name="playState"
   type="LiveData&lt;EPlayState>" 
   default="EPlayState.STOPPED"
/>

您的实施是使用 MVP 还是 MVVM 架构。在我看来,对 UI 部分代码进行业务逻辑操作不是一个好主意。 PlayState 相关的操作需要在 ViewModel 或 Presenter 上完成。所以我建议将此 LiveData 添加为与您的片段关联的 ViewModel/Presenter 的属性,并在 ViewModel/Presenter class 的初始化块中对其进行初始化。在您的片段中,假设片段的名称 xml 是 example_layout.xml 在片段的 OnCreateView 函数中添加以下代码,如下所示:

LayoutExampleBinding.inflate(inflater, container, false).also {
            it.lifecycleOwner = viewLifecycleOwner
            it.viewModel = <ViewModel>
            it.playState = <ViewModel>.playState
}.root

(如果使用 MVP 架构,则绑定 Presenter 而不是 ViewModel)

分配值时添加空检查

playState != null ? .. : ..

但也要重新考虑为什么要在那里使用实时数据..
您也可以只绑定状态并将其设置在观察者中。