Dołączam układ przechodzący przez viewmodel:

<include
    layout="@layout/user_login"
    app:model="@{model}" />

Moim celem jest użycie tego uwzględnienia w różnych miejscach, przekazując również inny ViewModel .

Na przykład chciałbym przekazać: UserViewModel w jednym miejscu, w innym InformationViewModel . Czy mogę to zrobić?

Z góry dziękuję

1
zerstoer 19 listopad 2019, 21:39

1 odpowiedź

Oto klasa komponentów

class SomeComponent(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) {

    private var mBinding: SomeLayoutBinding? = null

    init {
        if (isInEditMode) {
            val view = LayoutInflater.from(context).inflate(R.layout.some_layout, this, false)
            addView(view)
        } else {
            mBinding = SomeLayoutBinding.inflate(LayoutInflater.from(context), this, true)
        }
    }

    fun setVm(vm: InformationViewModel) {
        mBinding!!.vm = vm
        mBinding!!.executePendingBindings()
    }
}

Oto układ dla komponentu

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="vm"
            type="yourpackage.InformationViewModel" />
    </data>

</layout>

Oto sposób, w jaki ustawiasz vm

 <yourpackage.SomeComponent
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:vm="@{item}" />
1
azsoftco 19 listopad 2019, 22:37
Dziękuję za odpowiedź. Celem jest przekazanie innego ViewModel do układu, na przykład: app:vm="@{informationViewModel}" lub mogę przekazać app:vm="@{userViewModel}"
 – 
zerstoer
19 listopad 2019, 22:44
Jeśli chcesz to zrobić, musisz utworzyć "ParentVm" i tutaj możesz umieścić oba vms. Następnie „app:vm="@{parent.user}" . Czy to jest to, czego szukasz?
 – 
azsoftco
19 listopad 2019, 22:49
Chcę tylko móc przekazać model widoku do układu dołączania. W ten sposób układ uzyska to i powiąże funkcję kliknięcia z modelu widoku z przyciskami onClick. Ale model widoku nie może być zawsze tym samym modelem widoku.
 – 
zerstoer
19 listopad 2019, 23:01