Reputation: 2235
I have assigned the data for variable playState
before fire Code A , but the Code A still get the following error information.
method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter aEPlayState
I think playState
is a LiveData
, the initial value is null, it maybe cause error before I assign the data to it.
How can I fix it? is Code B right?
Code 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
}
Code B
<variable
name="playState"
type="LiveData<EPlayState>"
default="EPlayState.STOPPED"
/>
Upvotes: 3
Views: 2666
Reputation: 888
Add a null-check when you assign the value
playState != null ? .. : ..
But also reconsider why you use a livedata there..
You could also just bind the state and set it within an observer.
Upvotes: 1
Reputation: 331
Whether you are using MVP or MVVM architecture for your implementation. It is not good idea to have business logic manipulation on UI part of code in my opinion. The PlayState related manipulation need to be done on ViewModel or Presenter. So I suggest add this LiveData as attribute of the ViewModel/Presenter associated with your fragment, initialize it in init block of ViewModel/Presenter class. Inside your fragment, assuming name of xml for your fragment is example_layout.xml add following code inside OnCreateView function of fragment as follows :
LayoutExampleBinding.inflate(inflater, container, false).also {
it.lifecycleOwner = viewLifecycleOwner
it.viewModel = <ViewModel>
it.playState = <ViewModel>.playState
}.root
(Or bind Presenter instead of ViewModel if using MVP architecture)
Upvotes: 0