我必须上课:
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>
但是在数据绑定的情况下,它无法访问父类的属性。访问父类属性的正确方法是什么?
我相信你的问题是你的访问者不公开并且标记为@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}"
就是这样,不是你见过的最漂亮的东西我确定,但它确实有效。
我希望这可以节省一些人,因为我忍受了几个小时的痛苦。
快乐的编码。
将id中的产品类设为public,并提供数据并绑定到xml中。
public int id;
在xml中
android:text="@{catalogItem.id}"
没有这样的问题来访问任何属性,它并不都与它们的访问修饰符有关,它只需要适当的getter方法,可以从Binding类访问。由于id
是int,它只需要String转换器。
使Parent类的字段受到保护。子类只能访问受保护或公共字段。
protected int id;