【问题标题】:How to override xml view (that use data Binding) from Library in my project (# Override_Views_Data_Binding_Android )如何在我的项目中从库中覆盖 xml 视图(使用数据绑定)(# Override_Views_Data_Binding_Android)
【发布时间】:2020-02-13 10:27:48
【问题描述】:

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

我创建了一个库项目并将其作为库导入到另一个项目中,该库在其所有视图中都使用 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>

【问题讨论】:

    标签: android xml


    【解决方案1】:

    使用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

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

    参考:

    Override resources in library android

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

    参考:

    Programmatically adding a layout + children

    【讨论】:

    • 我已经使用了包含标签,因为我已经更新了我的问题,当我发布 apk 文件时,我需要解决强制转换异常或重复类,谢谢
    • 如果你的应用模块依赖于库模块,你不应该让应用模块生成一个新的绑定类。使用导入,以便在应用模块中使用的唯一绑定类是在库模块中生成的。
    • 我可以在哪里使用这样的导入? ` `这不起作用:(
    • 在您的活动中,您必须在某处实例化 DataBinding?
    • 是的,我有一个父类型的数据绑定,如果我覆盖视图,它将生成一个名称相同但包不同的新类:(
    【解决方案2】:

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

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

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

    【讨论】:

    • 对不起,类属性在发布版本中导致多个类异常。
    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 2015-05-17
    • 2011-09-27
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多