1

First of all I have deep search for that and I didn't find any related topic or solution :(

I have created a library project and import it as a library in another project, this library in all of its views use Android dataBinding, I need to override a xml view or portion of it(say include) in my project as follow :

product_details_quantity_layout.xml in Library

    <?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>

And in my project

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>

In this I got exception class cast exception, it can't cast the generated databinding class from child to the dataBinding in Parent so I updated the tag in my project xml file to

after that it work fine and inflate the new view, but when generating new APK it give duplicated class error that the found twice in parent and child projects

so dears any help in this case will be highly appreciated.

Update

This my Include tag in the full xml file in parent

<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)}" />

Second Update Adding Import


<?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>
Amr Ahmed
  • 71
  • 1
  • 12

2 Answers2

0

Using the include tag, you can pass variables.

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

Ref:

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

So if you have an include tag in your Library module, then override that xml file in your resources, you may be able to change it.

Ref:

Override resources in library android

Alternatively, you can programmattically add a view into your XML, it should work if you use the correct viewbing tags:

Ref:

Programmatically adding a layout + children

Blundell
  • 75,855
  • 30
  • 208
  • 233
0

You can use class attribute to avoid cast exception.

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

However, It seems the binding class is still from library project class. So, we can't override binding behavior. we can't add|remove binding elements from base library project xml. we can customize element only that area unrelated to data binding.

kumabook
  • 96
  • 1
  • 4