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

时间:2017-10-25 09:06:59

标签: android android-databinding android-include

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

因此login_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}"/>

现在,我希望我的progress_bar.xml更好,更通用,并使用基本视图模型:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="core.sdk.ui.login.LoginActivity">

<data>

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

    <variable
        name="viewModel"
        type="core.sdk.ui.base.BaseViewModel" />

</data>

<LinearLayout
    android:id="@+id/circular_progress"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical">

    <android.support.v4.widget.ContentLoadingProgressBar
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/progress_text"
        style="@style/TextAppearance.AppCompat.Subhead"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-thin"
        android:gravity="center_horizontal"
        android:text="@{viewModel.loadingText}"
        android:textStyle="italic"
        tools:text="loading..." />
</LinearLayout>

我得到的错误就像是

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

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

3 个答案:

答案 0 :(得分:4)

我认为你应该把它放在绑定中:

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

答案 1 :(得分:2)

您可以使用包含类似

的绑定

<强> loading_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>

使用

<include
        layout="@layout/loading_view"
        app:visibility="@{viewModel.loadingCondition}"
        app:text='@{"AA"}'
        />

您也可以传递像

这样的硬值
app:visibility="@{false}"
app:text="@{@string/loading_text}"

答案 2 :(得分:0)

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

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

<data>
    ...
    <variable
        name="viewModel"
        type="core.sdk.ui.base.BaseViewModel" />

</data>