Одинаковый макет привязки данных в другом фрагменте - PullRequest
0 голосов
/ 21 июня 2020

У меня вопрос по реализации той же схемы привязки данных в 2-х фрагментах. Пример : fragment_example. xml он будет использоваться ExampleBasicToolbarFragment и ExampleToolbarImageFragment. в каждом фрагменте есть функция onclick. Как этого добиться?

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="toolbarFragment"
            type="example.toolbar.ExampleBasicToolbarFragment" />

        <variable
            name="imageToolbarfragment"
            type="example.toolbar.ExampleToolbarImageFragment" />
    </data>

    <id.co.cicil.libs.core.view.viewstate.ViewState
        style="@style/Layout.Match"
        android:id="@+id/viewState">
        <LinearLayout
            android:id="@+id/linear"
            style="@style/Layout.Match"
            android:orientation="vertical"
            android:gravity="center">
            <androidx.appcompat.widget.AppCompatTextView
                style="@style/TextContent.Normal"
                android:text="INI FRAGMENT"/>
            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnSnackbar"
                style="@style/Button.Orange"
                android:text="coba snackbar"
                app:safeOnClick="@{**HOW I PASS MY FUNCTION TO THIS??**}"/>
        </LinearLayout>
    </id.co.cicil.libs.core.view.viewstate.ViewState>
</layout>

1 Ответ

0 голосов
/ 21 июня 2020

Используйте принцип абстракции, если вам нужна возможность обобщить несколько классов путем расширения интерфейса или абстрактного класса.

    <data>
        <variable
            name="customInterface"
            type="example.toolbar.CustomInterface" />
    </data>

    ...

            <com.google.android.material.button.MaterialButton
                android:id="@+id/btnSnackbar"
                style="@style/Button.Orange"
                android:text="coba snackbar"
                app:safeOnClick="@{() -> customInterface.performClick()}"/>

Этот интерфейс заставит расширяющиеся классы реализовать определенное поведение (определенные методы). Пример:

package example.toolbar

interface CustomInterface {
    void performOnClick();
}

Оба ваших фрагмента теперь могут реализовать этот интерфейс. Вы сможете передать экземпляр интерфейса в экземпляр привязки представления. Пример:

class ExampleBasicToolbarFragment extends Fragment, CustomInterface {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // create view binding instance
        viewBinding.customInterface = this
    }

    @Override
    void performOnClick() {
        ...
    }
}
class ExampleToolbarImageFragment extends Fragment, CustomInterface {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // create view binding instance
        viewBinding.customInterface = this
    }

    @Override
    void performOnClick() {
        ...
    }
}
...