Как переопределить xml представление (которое использует привязку данных) из библиотеки в моем проекте (# Override_Views_Data_Binding_ Android) - PullRequest
1 голос
/ 13 февраля 2020

Прежде всего у меня есть глубокий поиск, и я не нашел связанных топи c или решения: (

Я создал проект библиотеки и импортировал его как библиотеку в другой проект, эта библиотека во всех своих представлениях использует Android dataBinding, мне нужно переопределить 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>

В этом я получил исключение приведения класса исключения, он может ' преобразовал сгенерированный класс привязки данных из дочернего в dataBinding в Parent, поэтому я обновил тег в файле xml моего проекта до

, после этого он работал нормально и раздувал новое представление, но при создании нового APK дает дублированную ошибку класса, найденную дважды в родительских и дочерних проектах

, поэтому дорогая любая помощь в этом случае будет высоко оценена.

Обновление

T Его тег «Включить» в полном файле xml в родительском файле

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

1 Ответ

0 голосов
/ 13 февраля 2020

Используя тег include, вы можете передавать переменные.

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

Ссылка:

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

Итак, если у вас есть тег include в вашем модуле библиотеки, тогда переопределите этот файл xml в своих ресурсах, вы можете быть в состоянии изменить его.

Ссылка:

Переопределить ресурсы в библиотеке android

В качестве альтернативы, вы можете программно добавить представление в ваш XML, это должно работать, если вы используете правильные теги просмотра:

Ссылка:

Программно добавляем макет + потомки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...