繁体   English   中英

如何在我的项目 (# Override_Views_Data_Binding_Android ) 中从库中覆盖 xml 视图(使用数据绑定)

[英]How to override xml view (that use data Binding) from Library in my project (# Override_Views_Data_Binding_Android )

首先,我对此进行了深入搜索,但没有找到任何相关主题或解决方案:(

我创建了一个库项目并将其作为库导入到另一个项目中,该库在其所有视图中都使用 Android 数据绑定,我需要在我的项目中覆盖 xml 视图或其一部分(例如包含),如下所示:

库中的 product_details_quantity_layout.xml

    <?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"
        xmlns:tools="http://schemas.android.com/tools">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/cl_quantity"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/dim_product_details_sc_quantity_view_mrgn_top"
                android:layout_marginBottom="@dimen/dim_product_details_sc_quantity_view_mrgn_bottom"
                android:background="@drawable/product_quantity_bg"
                android:gravity="center"
                android:layoutDirection="ltr"
                android:paddingStart="@dimen/dim_product_details_sc_quantity_view_padding_start"
                android:paddingTop="@dimen/dim_product_details_sc_quantity_view_padding_top"
                android:paddingEnd="@dimen/dim_product_details_sc_quantity_view_padding_start"
                android:paddingBottom="@dimen/dim_product_details_sc_quantity_view_padding_bottom"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.42">

                <ImageView
                    android:id="@+id/iv_decrement"
                    multipleClick="@{true}"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:onClick="@{decreaseBtnClick}"
                    android:src="@drawable/ic_minus"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintDimensionRatio="1:1.4"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintWidth_percent="0.15" />

                <ImageView
                    android:id="@+id/iv_increment"
                    multipleClick="@{true}"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:onClick="@{increaseBtnClick}"
                    android:src="@drawable/ic_add"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintDimensionRatio="1:1.4"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintWidth_percent="0.15" />


                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="@{productQty}"
                    android:textAlignment="center"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toStartOf="@id/iv_increment"
                    app:layout_constraintStart_toEndOf="@id/iv_decrement"
                    app:layout_constraintTop_toTopOf="parent"
                    tools:text="1" />

            </androidx.constraintlayout.widget.ConstraintLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

        <data>

            <import type="android.view.View" />

            <variable
                name="productQty"
                type="String" />

            <variable
                name="increaseBtnClick"
                type="android.view.View.OnClickListener" />

            <variable
                name="decreaseBtnClick"
                type="android.view.View.OnClickListener" />
        </data>


    </layout>

在我的项目中

product_details_quantity_layout.xml


<?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"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ui.view.product_details.ProductDetailsActivity"
    >

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/cl_quantity"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layoutDirection="ltr"
            android:paddingStart="@dimen/dim_product_details_sc_quantity_view_padding_start"
            android:paddingTop="@dimen/dim_product_details_sc_quantity_view_padding_top"
            android:paddingEnd="@dimen/dim_product_details_sc_quantity_view_padding_start"
            android:paddingBottom="@dimen/dim_product_details_sc_quantity_view_padding_bottom"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintWidth_percent="0.42">

            <ImageView
                android:id="@+id/iv_decrement"
                multipleClick="@{true}"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:onClick="@{decreaseBtnClick}"
                android:src="@drawable/ic_minuse_circle"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintDimensionRatio="1:1"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.23" />

            <ImageView
                android:id="@+id/iv_increment"
                multipleClick="@{true}"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:onClick="@{increaseBtnClick}"
                android:src="@drawable/ic_add_circle"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintDimensionRatio="1:1"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.23" />


            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@{productQty}"
                android:textAlignment="center"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@id/iv_increment"
                app:layout_constraintStart_toEndOf="@id/iv_decrement"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="1" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <data >

        <import type="android.view.View" />

        <variable
            name="productQty"
            type="String" />

        <variable
            name="increaseBtnClick"
            type="android.view.View.OnClickListener" />

        <variable
            name="decreaseBtnClick"
            type="android.view.View.OnClickListener" />
    </data>


</layout>

在这个我得到了异常类转换异常,它无法将生成的数据绑定类从子级转换为父级中的数据绑定,所以我将项目 xml 文件中的标记更新为

之后它可以正常工作并扩展新视图,但是在生成新的 APK 时它会给出重复的类错误,在父项目和子项目中发现了两次

所以亲爱的,在这种情况下的任何帮助将不胜感激。

更新

这是我在父级的完整 xml 文件中的 Include 标记

<include
                android:id="@+id/cl_quantity"
                layout="@layout/product_details_quantity_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:decreaseBtnClick="@{()->viewModel.onDecreaseQty()}"
                app:increaseBtnClick="@{()->viewModel.onIncreaseQty()}"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:productQty="@{String.valueOf(viewModel.productQty)}" />

第二次更新添加导入


<?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"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".ui.view.product_details.ProductDetailsActivity"
    >

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/cl_quantity"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layoutDirection="ltr"
            android:paddingStart="@dimen/dim_product_details_sc_quantity_view_padding_start"
            android:paddingTop="@dimen/dim_product_details_sc_quantity_view_padding_top"
            android:paddingEnd="@dimen/dim_product_details_sc_quantity_view_padding_start"
            android:paddingBottom="@dimen/dim_product_details_sc_quantity_view_padding_bottom"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintWidth_percent="0.42">

            <ImageView
                android:id="@+id/iv_decrement"
                multipleClick="@{true}"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:onClick="@{decreaseBtnClick}"
                android:src="@drawable/ic_minuse_circle"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintDimensionRatio="1:1"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.23" />

            <ImageView
                android:id="@+id/iv_increment"
                multipleClick="@{true}"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:onClick="@{increaseBtnClick}"
                android:src="@drawable/ic_add_circle"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintDimensionRatio="1:1"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.23" />


            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@{productQty}"
                android:textAlignment="center"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@id/iv_increment"
                app:layout_constraintStart_toEndOf="@id/iv_decrement"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="1" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <data >

        <import type="***.databinding.ProductDetailsQuantityLayoutBinding"/>
        <import type="android.view.View" />

        <variable
            name="productQty"
            type="String" />

        <variable
            name="increaseBtnClick"
            type="android.view.View.OnClickListener" />

        <variable
            name="decreaseBtnClick"
            type="android.view.View.OnClickListener" />
    </data>


</layout>

使用include标签,您可以传递变量。

    <include android:id="@+id/secondary"
        layout="@layout/data_binding_included_secondary_layout"
        bind:secondaryUser="@{mainUser}"/>

参考:

https://medium.com/@elia.maracani/android-data-binding-passing-a-variable-to-an-include-d-layout-3567099b58f

因此,如果您的 Library 模块中有一个include标记,然后在您的资源中覆盖该 xml 文件,您就可以更改它。

参考:

覆盖库android中的资源

或者,您可以以编程方式将视图添加到 XML 中,如果您使用正确的查看标签,它应该可以工作:

参考:

以编程方式添加布局 + 子项

您可以使用class属性来避免强制转换异常。

https://developer.android.com/topic/libraries/data-binding/generated-binding#custom_binding_class_names

但是,绑定类似乎仍然来自库项目类。 所以,我们不能覆盖绑定行为。 我们无法从基础库项目 xml 中添加|删除绑定元素。 我们只能自定义与数据绑定无关的区域的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM