Android 包含布局的数据绑定变量继承

Android 包含布局的数据绑定变量继承,android,android-databinding,android-include,Android,Android Databinding,Android Include,我正在学习数据绑定和mvvm。我有一个问题,我希望BaseViewModel.kt包含一些与UI相关的变量,例如isLoading标志和loadingText。当发出网络请求时,我将isLoading设置为true,并且我的基本视图模型的一些子级应该设置文本。例如,对于LoginViewModel.kt来说,文本可能是“登录”。是否可以将这些变量传递给包含的基本布局 因此,login\u activity.xml可能会在其布局中包含以下内容: <data> &

我正在学习数据绑定和mvvm。我有一个问题,我希望
BaseViewModel.kt
包含一些与UI相关的变量,例如
isLoading
标志和
loadingText
。当发出网络请求时,我将
isLoading
设置为true,并且我的基本视图模型的一些子级应该设置文本。例如,对于
LoginViewModel.kt
来说,文本可能是“登录”。是否可以将这些变量传递给包含的基本布局

因此,
login\u activity.xml
可能会在其布局中包含以下内容:

    <data>
        <import type="android.view.View" />
        <variable
            name="viewModel"
            type="core.sdk.ui.login.LoginViewModel" />
    </data>

<!-- Various click listeners using the viewModel variable -->

    <include
        android:id="@+id/progress_include"
        layout="@layout/progress_bar"
        android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"
        bind:viewModel="@{viewModel}"/>

我得到的错误是

****/ data binding error ****msg:Cannot find the setter for attribute 'bind:viewModel' with parameter type core.sdk.ui.login.LoginViewModel

如果这是不可能的,我能看到的唯一选择是删除include,并将进度条+文本复制粘贴到每个视图模型,这不是很好。

我认为您应该在绑定中强制转换它:

<include
    android:id="@+id/progress_include"
    layout="@layout/progress_bar"
    android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"
    bind:viewModel="@{(core.sdk.ui.base.BaseViewModel)viewModel}"/>

您可以像include一样使用绑定

加载_view.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    >

    <data>

        <import type="android.view.View"/>

        <variable
            name="visibility"
            type="boolean"
            />

        <variable
            name="text"
            type="String"
            />
    </data>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ff0"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:visibility="@{visibility?View.VISIBLE:View.GONE}"
        >
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="@{text}"
            tools:text="AA"
            />
    </LinearLayout>
</layout>

对于仍然没有解决方案的用户,只需检查您的代码,并检查“bind”属性的名称是否与包含的布局中使用的名称相同

<include
       ...
        bind:viewModel="@{viewModel}"/>


...

谢谢我发誓我试过了,但它不喜欢:)我希望我也能把这个标记为答案,这非常有用,谢谢!我已经这样做了,但是文本只是一个空字符串(不显示),没有任何值,不管我在那里放了什么。我省略了可见性部分,所以我知道不是那样的。帮助?@Elliptica,可见性的默认值为false,如果你想显示,你需要将其更改为true在你的示例中,是的,但在我的示例中,默认值为true。我没有将可见性设置为false。更重要的是,我在我的文本视图上放置了一个背景,这样我可以看到视图正在渲染,它只是空的(没有文本)。
<include
        layout="@layout/loading_view"
        app:visibility="@{viewModel.loadingCondition}"
        app:text='@{"AA"}'
        />
app:visibility="@{false}"
app:text="@{@string/loading_text}"
<include
       ...
        bind:viewModel="@{viewModel}"/>
<data>
    ...
    <variable
        name="viewModel"
        type="core.sdk.ui.base.BaseViewModel" />

</data>