[英]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}"/>
参考:
因此,如果您的 Library 模块中有一个include
标记,然后在您的资源中覆盖该 xml 文件,您就可以更改它。
参考:
或者,您可以以编程方式将视图添加到 XML 中,如果您使用正确的查看标签,它应该可以工作:
参考:
您可以使用class
属性来避免强制转换异常。
但是,绑定类似乎仍然来自库项目类。 所以,我们不能覆盖绑定行为。 我们无法从基础库项目 xml 中添加|删除绑定元素。 我们只能自定义与数据绑定无关的区域的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.