Intereting Posts
Получил эту ошибку с помощью retrofit2 & OkHttp3. Не удалось разрешить хост «<имя-хоста>»: нет адреса, связанного с именем хоста Canvas .toDataURL () возвращает частично поврежденное изображение Я продолжаю получать ошибку «Никакой активности не найдено для обработки намерения» Стандартный метод кэширования данных в Android? Android – Как вызвать широковещательный приемник для вызова метода onReceive ()? Создайте новый альбом в галерее и сохраните в нем изображения Закрыть приложение при нажатии кнопки на Android Преобразование json десятичного числа в короткий с шестнадцатеричным значением Android «gen» и SVN – горькие враги Отображать многострочные / несколько символов в качестве метки клавиш на клавишах мягкой клавиатуры Любой безболезненный способ запускать мягкую клавиатуру для EditText в диалогах? Ошибка при компиляции AIDL Как открыть / отобразить документы (.pdf, .doc) без внешнего приложения? Несколько классов в одном физическом файле на android Сервис, WakeLock

Android DataBinding и MVVM – использование одинаковых файлов макета для разных условий с использованием одинаковых моделей просмотра

Я разрабатываю приложение с привязкой данных и MVVM.

Я пытаюсь использовать альтернативный макет для своего приложения в ландшафтном режиме. У меня есть:

layout/fragment_content.xml layout-land/fragment_content.xml 

Оба макета имеют одинаковые виды с различным внешним видом и получают каналы с одинаковых моделей просмотра, например:

 <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data class="MyBinding"> <variable name="viewModel" type="com.myapp.package.viewModel.VMFirst"/> <variable name="controlModel" type="com.myapp.package.viewModel.VMSecond"/> </data> <DIFFERENT CONTENT HERE> 

Все представления и идентификаторы существуют в обоих макетах.

Ну, проблема в том, что она не компилируется, ошибка просто "cannot find symbol method getViewModel" и getter для другой переменной.

То, что я пробовал до сих пор:

  1. Использование макетов и макетов-папок (Failed, ошибка объясняется выше)

  2. Использование псевдонимов компоновки Используйте псевдонимы макета, которые я нашел здесь. Выпуск 199344: привязка данных не работает с псевдонимами макета . При этом я ничего не менял в xml-файлах. Это также не удалось, ошибка не Could not write to com.myapp.package.databinding.MyBinding

Невозможно использовать тег данных привязки data в нескольких файлах макета? Что я должен использовать для использования разных макетов для разных состояний при использовании привязки данных? Благодаря !

Изменить: удаление class="MyBinding" не изменило ошибок.

Я активно использую MVVM в своих приложениях, а также создаю вокруг нее библиотеку.

Я соглашаюсь с тем, что в каждом XML есть одна ViewModel. Кроме того, имя переменной viewmodel одинаково во всех XML-файлах.

Итак, в вашем случае вы можете создать еще один класс ViewModel, содержащий VMFirst и VMSecond .

 public class ParentVM { VMFirst first; VMSecond second; } 

И XML (портрет и пейзаж) будут иметь одинаковые имена, скажем, activity_main.xml .

 <layout> <data> <variable type="ParentViewModel" name="vm"/> </data> 

Тогда в коде MainActivity не требуется проверка.

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewDataBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setVariable(BR.vm, new ParentViewModel()); } 

Это работает.

Преимущества одиночной ViewModel

На самом деле, поскольку я следую одному и тому же имени переменной во всех xmls, я могу включить логику привязки в базовый класс MvvmActivity . Итак, все мои действия выглядят так:

 public class MainActivity extends MvvmActivity { @NonNull @Override protected ViewModel createViewModel() { return new MainViewModel(); } @Override protected int getLayoutId() { return R.layout.activity_main; } } 

Реализация MvvmActivity : MvvmActivity.java

Другим преимуществом сохранения постоянной привязки данных является то, что вы можете настроить адаптеры RecyclerView или ViewPager в самом XML. Дополнительную информацию см. В разделе Настройка RecyclerView из XML .

По умолчанию класс Binding будет сгенерирован на основе имени файла макета, преобразуя его в регистр Pascal и суффикса «привязка» к нему. Вышеуказанный файл макета был main_activity.xml, поэтому класс generate был MainActivityBinding. – Данные привязки

И генерируется во время компиляции.

Поэтому, выберите другой макет по java-коду.

 layout/ R.layout.activity_main R.layout.activity_main_tablet values/ <bool name="is_mobile">true</bool> <bool name="is_tablet">false</bool> values-w820dp/ <bool name="is_mobile">false</bool> <bool name="is_tablet">true</bool> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(getResources().getBoolean(R.bool.is_mobile)) { ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); } else { ActivityMainTabletBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main_tablet); } }