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

3

在执行代码A之前,我已经为变量playState分配了数据,但是代码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"
/>

我认为你的代码不会起作用。据我所知,变量没有默认属性。为什么不直接使用“EPlayState.STOPPED”状态初始化LiveData呢?无论如何,你都必须进行初始化。 - ADM
谢谢!但LiveData是懒加载的,即使我已经初始化它,它可能仍然为空。 - HelloCW
谢谢!但是LiveData是延迟加载的,即使我已经初始化了,它可能仍然为空。 - HelloCW
在这种情况下,您可以使用 app:iamgeForPlayPause="@{playState!=null?playState:EPlayState.STOPPED}" - ADM
为什么你实际上想要在那里使用LiveData? - Tobi
2个回答

1
在赋值时添加空值检查。
playState != null ? .. : ..

但是也要重新考虑为什么在那里使用LiveData..
您也可以只绑定状态并在观察者中设置它。


0
不管你是使用MVP还是MVVM架构进行实现。我认为在UI代码的业务逻辑处理中进行操作并不是一个好主意。PlayState相关的操作需要在ViewModel或Presenter上完成。因此,我建议将LiveData作为与您的片段相关联的ViewModel/Presenter的属性添加,然后将其初始化为ViewModel/Presenter类的init块。在您的片段中,假设您的片段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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接