*编辑:要回答我自己的问题,我必须将 EditorViewModel 作为导入添加到外部布局中的父抽象类,并使用app:viewModel="@{((EditorViewModel)viewModel)}将 viewModel 转换为父类“,就是这样!我发誓我不记得以前做过这个演员表……*
我的问题是因为包含的布局定义了一个类型,它是外部布局试图与包含的布局共享的 viewModel 的父抽象类,而不是子具体类。
我已经确认将包含的布局类型更改为子具体类的类型可以解决问题,但是,它应该适用于抽象类类型......
这是我定义 viewModel 变量的方式,这是以下类型中的具体类:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.ootpapps.gpeofflinedatacollection.viewmodels.EquipmentEditorViewModel" />
</data>
...
几句话之后,我包含了布局,试图从上面共享 viewModel:
<include
layout="@layout/layout_spinner_location"
app:viewModel="@{viewModel}" />
在包含的布局中,变量 viewModel 定义如下:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.ootpapps.gpeofflinedatacollection.viewmodels.EditorViewModel" />
</data>
当然,这里的 EquipmentEditorViewModel 显示它扩展了抽象父类 EditorViewModel(在包含的布局中定义为上面的父类类型):
public class EquipmentEditorViewModel extends EditorViewModel<Equipment> {
我收到的错误是:
****/ 数据绑定错误 ****msg:在 com.ootpapps.gpeofflinedatacollection.databinding.LayoutSpinnerLocationBinding 上找不到参数类型为 com.ootpapps.gpeofflinedatacollection.viewmodels.EquipmentEditorViewModel 的属性“app:viewModel”的设置器。文件:C:\Users\Ryan\AndroidstudioProjects\GPEOfflineDataCollection\app\src\main\res\layout\content_equipment_editor.xml 位置:31:33 - 31:41 ****\数据绑定错误 ****
正如我上面提到的,将 layout_spinner_location 中的类型更改为“EquipmentEditorViewModel”可以修复错误,但是,我需要使用抽象类型才能重新使用此视图,因为它并不总是使用 EquipmentEditorViewModel,有时它需要一个“ ToolEditorViewModel”或“MeasurmentEditorViewModel”,它们都扩展了 EditorViewModel。
非常感谢您的帮助。也许我会很幸运,乔治·芒特会过来。