【问题标题】:Same databinding layout in different fragment不同片段中的相同数据绑定布局
【发布时间】:2020-06-21 08:24:58
【问题描述】:

我对在 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>

【问题讨论】:

  • safeOnClick 是什么?
  • 你想在两个片段中使用一个膨胀的布局实例吗?如果是 - 避免这种情况。每个片段必须控制自己的视图。同样,如果是 - 为什么需要这样的实现?
  • @ShaluTD 这是我的自定义绑定数据
  • @JeneaVranceanu 所以我有 2 个片段可以使这个fragment_example.xml 膨胀,并且有 1 个按钮来显示 toast。如果没有数据绑定,我可以在没有多个布局 xml 的情况下实现这一点。但我正在尝试通过数据绑定来实现这一目标,但我遇到了困难。

标签: android android-fragments data-binding


【解决方案1】:

如果您需要通过扩展接口或抽象类来概括多个类的能力,请使用抽象原则。

    <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() {
        ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多