如何在 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<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<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 ? .. : ..
但也要重新考虑为什么要在那里使用实时数据..
您也可以只绑定状态并将其设置在观察者中。
我在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<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<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 ? .. : ..
但也要重新考虑为什么要在那里使用实时数据..
您也可以只绑定状态并将其设置在观察者中。