0

I have:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <import type="android.view.View" />
        <variable name="vm" type="com.my.package.viewmodel.SplashActivityVM" />
    </data>

    <android.support.v7.widget.LinearLayoutCompat
        bla...>

        <TextView
            bla...
            android:text='@{vm.status}'
            bla... />
bla...

with activity.java:

@Override
protected void onCreate(Bundle savedInstanceState) { bla... }

private void observeStatus(SplashActivityVM viewModel) {
        viewModel.getStatus().observe(this, status -> {
            if (status != null) {
                mBinding.setVm(viewModel);
            } else { }
            mBinding.executePendingBindings();
        });
    }

and my ViewModel:

public class SplashActivityVM extends AndroidViewModel implements ViewModel {

    private final MutableLiveData<SplashState> mObservableStatus = new MutableLiveData<>();
    public MutableLiveData<SplashState> getStatus() { return mObservableStatus; }

    public SplashActivityVM(@NonNull Application application) { super(application); }

// bla...

and I received below error:

msg:Cannot find the setter for attribute 'android:text' with parameter type android.arch.lifecycle.MutableLiveData on android.widget.TextView.

What's wrong?

AnD
  • 3,060
  • 8
  • 35
  • 63

1 Answers1

0
  1. You need custom binding adapter for your SplashState

    TextViewAdapters.kt

@BindingAdapter("android:text")
fun setText(view: TextView, state: SplashState) {
    view.text = state.toString()
}
  1. Set viewLifecycleOwner to your data binding for livedata
@Override
protected void onCreate(Bundle savedInstanceState) { bla... 

mBinding.setLifecycleOwner(this);
}
  1. Remove observeStatus method, set VM to binding
@Override
protected void onCreate(Bundle savedInstanceState) { bla... 

mBinding.setLifecycleOwner(this);
mBinding.setvm(viewModel);
}