Android Управление пользовательским интерфейсом MVVM - PullRequest
2 голосов
/ 06 августа 2020

Я начал изучать MVVM с LiveData на Android. Думаю, отображение и обновление данных basi c мне понятно. Topi c, который я изо всех сил пытаюсь найти, - это управление пользовательским интерфейсом.

Допустим, у меня есть базовый c UI, например форма. Он имеет несколько EditTextView для ввода данных. В конце также есть переключатель. Если это ON , показывается еще несколько EditTextView для заполнения. Когда он OFF , конечно, они ушли.

Мой вопрос, где реализовать этот logi c?

  1. В коде действия / фрагмента? Тогда бизнес-логи c будут задействованы в части VIEW MVVM (что мне не очень нравится).

  2. В ViewModel? Тогда бизнес-лог c будет существовать, скажем, в кэше данных . Таким образом, мне пришлось бы создать кучу boolean геттеров в ViewModel, которые вычисляют значения для отдельных видимости View. Затем в моем Activity в блоке подписки для изменения LiveData мне нужно прочитать все эти значения и установить видимость для представлений один за другим.

  3. В отдельном Service / Helper / Утилитарный класс? Это было бы то же самое решение, что и # 2, только logi c, извлеченное из ViewModel.

Какая здесь лучшая практика? Тем не менее, тот же вопрос может возникнуть при проверке правильности ввода пользователем c (и я предполагаю, что существует ряд таких областей).

1 Ответ

0 голосов
/ 06 августа 2020

Я бы go со вторым подходом, но немного другой реализацией (с использованием DataBinding), вдохновленным примером приложения Sunflower от Google: https://github.com/android/sunflower Предполагается, что он будет представлять лучшие практики Jetpack, включая MVVM .

Затем в моем Activity в блоке подписки для изменения LiveData мне нужно прочитать все эти значения и установить видимость для представлений по одному.

Вместо этого вы можете подписать свой макет на модель просмотра (с помощью DataBinding), примерно так: https://github.com/android/sunflower/blob/master/app/src/main/res/layout/fragment_plant_detail.xml

    <data>
        <import type="com.google.samples.apps.sunflower.data.Plant"/>
        <variable
            name="viewModel"
            type="com.google.samples.apps.sunflower.viewmodels.PlantDetailViewModel" />
    </data>

, а затем используйте настройку видимости на основе ссылок на модель просмотра без геттеров, в самом макете

app:isGone="@{!viewModel.isUnderAge}"

или

android:visibility="@{viewModel.isUnderAge?  View.VISIBLE : View.INVISIBLE}"
...