子类的Android数据绑定

问题描述 投票:0回答:4

我必须上课:

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>

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

android data-binding parent-child
4个回答
2
投票

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

我发现了同样的问题,然后在墙上撞了好几个小时。我最终发现了一个帖子,其中有人谈到了xml中的类型转换。我准备传入子类和父类,就像声明它们一样,并且只在构造函数中将它们设置为同一个对象。这是一个选择,只是不优雅。

首先,问题xml数据绑定还不够智能,无法在编译时为xml编译数据类。这是一个短暂的到来,希望他们很快就能解决。如果有人在修复此问题后阅读此内容,请随时更新帖子;)。

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

选项1

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

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

然后在你的onCreate中你将使用set both。

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

现在我不了解你,但我不喜欢这个,因为它给未来的开发人员带来了两个截然不同的对象的错觉,如果你没有把它们命名得很好,可能会让人感到困惑。所以我选择了2。

方案2

类型铸造,我给它一个镜头,它工作:)。你不会得到intellisense,所以你只需知道你在输入什么,但它确实有效,我向你保证。

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

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

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

我希望这可以节省一些人,因为我忍受了几个小时的痛苦。

快乐的编码。


0
投票

将id中的产品类设为public,并提供数据并绑定到xml中。

public int id;

在xml中

 android:text="@{catalogItem.id}"

0
投票

没有这样的问题来访问任何属性,它并不都与它们的访问修饰符有关,它只需要适当的getter方法,可以从Binding类访问。由于id是int,它只需要String转换器。


-1
投票

使Parent类的字段受到保护。子类只能访问受保护或公共字段。

protected int id;
© www.soinside.com 2019 - 2024. All rights reserved.