Android 子类的数据绑定(bind)

标签 android data-binding parent-child

我必须上课:

public class Product {
  private int id;
  private String title;
  .............
  .............
}

其他类如下:

public class CatalogItem extends Product {
   private int price;
   private String[] colors;
   .............
   .............
}

在布局中,我想访问子类和父类的所有属性。

<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="catalogItem "
            type="com.appdemo.db.entity.CatalogItem" />
   </data>
   <TextView
            android:id="@+id/productIdTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:text="@{((com.appdemo.db.entity.Product) catalogItem).id}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
     ..................
     ..................
</layout>

但是在数据绑定(bind)的情况下,无法访问父类的属性。访问父类属性的正确方法是什么?

最佳答案

我相信你的问题是你的访问器不是公开的,并且在你进行类型转换时被标记为@Bindable,这很好,但是如果你发布 Pseduo 代码并且仍然被卡住。我会让你知道我遇到了什么。

我发现了同样的问题,并为此撞了几个小时的头。我最终找到了一篇文章,其中有人讨论了 xml 中的类型转换。我准备传入子类和父类,就像声明它们一样,然后将它们在构造函数中设置为同一个对象。这是一种选择,但不是一个优雅的选择。

首先是问题 xml 数据绑定(bind)还不够智能,无法在编译 xml 时创建数据类来爬取基类。这是一个缺点,希望他们能尽快解决。如果有人在解决此问题后阅读本文,请随时更新帖子;)。

现在是解决方案 基本上你有两个选择。

选项 1

您可以在 xml 中声明这两个变量,如下所示:

 <data>
    <variable name="parentPropertyModel" type="com.mypath.BaseModel"/>
    <variable name="childPropertyModel" type="com.mypath.ChildModel"/>
</data>

然后在您的 onCreate 中您将使用设置两者。

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_myscreen)
    mBinding.childPropertyModel = mSelectedObject
    mBinding.parentPropertyModel = mSelectedObject
}

然后,您当然可以使用您所接触的属性所需的那个。

android:text="@{childPropertyModel.fieldInChild}"
android:hint="@{parentPropertyModel.fieldInParent}"

现在我不了解你,但我不喜欢这样,因为它给 future 的开发人员带来了两个不同对象的错觉,如果你没有很好地命名它们,可能会令人困惑。所以我选择了选项 2。

选项 2

类型转换,我试了一下,成功了:)。您不会获得智能感知,因此您只需要知道您正在输入的内容,但我向您保证它是有效的。

像以前一样声明你的变量。

<data>
     <variable name="classModel" type="com.mypath.ChildModel"/>
</data>

然后像以前一样在 onCreate 中设置它,但现在只有一个对象。

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_myscreen)
        mBinding.classModel = mSelectedObject
 }

然后根据需要使用它,并像这个完全限定的路径一样进行强制转换。

android:text="@{classModel.fieldInChild}"
android:hint="@{((com.mypath.BaseModel)classModel).fieldInParent}"

就是这样,我确信这不是你见过的最漂亮的东西,但它确实有效。

我希望这可以帮助其他人免去我在解决这个问题时所经历的几个小时的头痛,哈哈。

祝你编码愉快。

关于Android 子类的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49858539/

相关文章:

android - 了解 rootadb 如何在 ELF 二进制文件中查找方法调用

html - Vue 2 原始 HTML 绑定(bind)到文本区域

android - 在新的 Android Studio 3.1 上构建时出错

javascript - 如果父元素有子元素则添加 onclick 类

php - 需要 mysql 查询帮助 - 按父级分组

java - SQLiteDatabase删除涉及子查询

java - SQL查询没有返回结果怎么办?

android - 如何使用 "adjustResize"在 Android 中使用 phonegap 调整 View ?

android - 数据绑定(bind) BR 在我的 mvvm 项目中的 notifyPropertyChanged 方法中不起作用

php - Wordpress functions.php 子主题