Наследование переменных базы данных с включенным макетом
Я изучаю привязку данных и mvvm. У меня есть проблема, где я хотел бы BaseViewModel.kt
включить некоторые переменные, связанные с пользовательским интерфейсом, такие как isLoading
флаг и loadingText
, Когда сетевой запрос сделан, я установил isLoading
к истине, и какой-то ребенок из моей базовой модели представления должен установить текст. Например для 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
Если это невозможно, единственная альтернатива, которую я вижу, - это убрать включение, скопировать и вставить индикатор выполнения + текст в каждую модель представления, что не очень приятно.
2 ответа
Я думаю, что вы должны бросить это в обязательном порядке:
<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}"/>
Для тех, у кого все еще нет решения, просто проверьте свой код и проверьте, совпадает ли имя атрибута "bind" с именем, используемым во включенном макете.
<include
...
bind:viewModel="@{viewModel}"/>
а также
<data>
...
<variable
name="viewModel"
type="core.sdk.ui.base.BaseViewModel" />
</data>
Вы можете использовать связывание с включенным как
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}"