Если синтетика Kotlin уходит, не пора ли переходить на альтернативы?

С самого начала разработки Android существовало множество способов доступа к представлениям из файлов макета XML внутри классов для выполнения над ними операций. Давайте рассмотрим эволюцию импорта просмотров.

findViewById

Первоначально мы использовали метод findViewById(), передав идентификатор представления для доступа к представлению. Это добавило много шаблонного кода во все файлы классов, которые раздували макеты. Многократное написание этих строк кода только для того, чтобы найти представления, было неинтересно и неудобно.

Синтаксис

TextView emailTextView;
emailTextView = (TextView) findViewById(R.id.txt_email);
  • R.id.txt_email означает представление, которое определено в любом макете с идентификатором txt_email .
  • R - это класс в Android, у которого есть набор всех идентификаторов представлений.
  • findViewById - это метод, который используется для поиска представления в файле ресурсов макета, который прикреплен к текущему действию.

К недостаткам можно отнести:

  1. NullPointerException и ClassCastException не приводят к нулевой безопасности или безопасности типов.
  2. Больше шаблонного кода.

ButterKnife

После нескольких лет борьбы мы перешли на ButterKnife , библиотеку на основе аннотаций, чтобы упростить доступ к представлениям. ButterKnife - это библиотека для инъекций представлений для Android. Мы должны интегрировать зависимость в файл gradle, а затем использовать соответствующие аннотации для доступа к представлениям.

К недостаткам можно отнести:

  1. Это тоже не было захватывающим. Хотя мы уменьшили количество строк, шаблонный код по-прежнему присутствует во всех файлах классов вверху.
  2. Трассировку стека было немного трудно читать.
  3. Он устарел, а разработка функций и исправление общих ошибок остановлены.

Теперь о синтетике Kotlin, которая последние три года правит миром разработки Android с точки зрения импорта представлений.

Котлин Синтетика

Синтетика является частью расширения Kotlin для Android, разработанного JetBrains. Синтетика значительно упрощает и упрощает привязку представлений в коде . Синтетика позволяет нам заменять вызовы findViewById с помощью kotlinx.android.synthetic привязок.

Нам нужно добавить плагин в gradle файл для доступа к синтетике:

apply plugin: 'kotlin-android-extensions'

Синтетика Kotlin устарела?

Многие разработчики полюбили и быстро приняли синтетику Kotlin, потому что она была очень простой в использовании. Однако с выпуском Kotlin 1.4.20 было официально объявлено, что расширения Kotlin для Android устарели.

В версии 1.4.20 команда JetBrains извлекла генератор реализаций Parcelable из kotlin-android-extensions и начала цикл прекращения поддержки синтетических компонентов. Пока синтетика будет продолжать работать с предупреждением об устаревании. android-kotlin-extensions будет удален в будущем выпуске Kotlin в сентябре 2021 г. (или позже).

Почему синтетика Kotlin устарела?

Использование синтетики Kotlin имеет ряд недостатков:

  • Они загрязняют глобальное пространство имен.
  • Они не раскрывают информацию о допустимости пустых значений.
  • Они работают только в коде Kotlin.
  • Использование ароматов продуктов вызывает ошибки в синтетических операторах импорта при переключении вкусов.
  • Импорт представлений с одинаковыми идентификаторами в нескольких макетах вызывает проблемы с накладными расходами.

Привязка просмотра Android Jetpack

Привязка представлений - это текущая рекомендация команды Google по импорту представлений из XML в классы Activity, Fragment или Adapter. Привязка представлений - это функция, которая позволяет нам более легко писать код, взаимодействующий с представлениями. В большинстве случаев привязка просмотра заменяет findViewById. Он поддерживает как Java, так и Kotlin.

Действия, которые необходимо выполнить:

  1. Включите привязку представления в build.gradle (дополнительных зависимостей не требуется).
  2. Он генерирует класс привязки для каждого макета XML, присутствующего в этом модуле.
  3. Экземпляр класса привязки содержит прямые ссылки на все представления, имеющие идентификатор в соответствующем макете.

Настраивать

Привязка представления - это конфигурация на уровне модуля, аналогичная расширениям Android. Нет необходимости добавлять какие-либо дополнительные зависимости. Давайте включим привязку представления, установив для нее значение true в build.gradle файле уровня модуля.

Начиная с Android Studio версии 4.0:

android {
    ...
    buildFeatures {
        viewBinding true
    }
}

После включения функции она автоматически (при построении или использовании параметра rebuild) сгенерирует все классы привязки для макетов, присутствующих в этом модуле.

Отключение привязки просмотра

Если мы хотим пропустить создание класса привязки, нам нужно добавить атрибут tools:viewBindingIgnore="true" в корневое представление этого файла макета:

<LinearLayout
        ...
        tools:viewBindingIgnore="true" >
    ...
</LinearLayout>

Давайте проверим использование представлений в Activity и Fragment классах.

Базовое использование на уровне класса

Нам нужно знать о создании класса привязки перед его использованием. Имя класса привязки - это имя XML-файла в случае Паскаля со словом Binding, добавленным в конец.

Например, если имя файла макета - activity_main.xml, имя сгенерированного класса привязки - ActivityMainBinding.

Использование привязки представления в действии

Давайте создадим образец проекта и проверим поток доступа к элементам представления внутри Activity.

Чтобы увидеть полную базу кода, пожалуйста, проверьте просмотр образца привязки.

  1. Создайте новый проект в Android Studio: File → New Project →…
  2. Включите привязку представления в файле build.gradle уровня приложения:
android{
......
buildFeatures {
    viewBinding true
}
}

3. Перестройте проект и проверьте сгенерированную папку на предмет сгенерированного класса привязки или найдите имя класса, нажав двойную смену. Имя класса привязки - это имя файла макета в случае Паскаля со словом Binding, добавленным в конец. В моем случае это ActivityMainBinding, который выглядит так:

4. Теперь мой ActivityMainBindingclass содержит свойства для каждого представления с идентификатором в макете. Итак, давайте добавим текстовое представление с идентификатором text_email в файл макета и перестроим проект. Затем мы проверим файл ActivityMainBinding на наличие изменений:

5. Нам нужно выполнить три следующих шага, чтобы получить доступ к экземпляру класса привязки и установить для представления Activity:

  1. Нам нужно вызвать статический метод inflate(), включенный в сгенерированный ActivityMainBindingclass. Это создает экземпляр или объект класса привязки для использования Activity.
  2. Затем получите ссылку на корневое представление, вызвав метод getRoot() или используя синтаксис свойств Kotlin.
  3. Наконец, установите для корневого представления значение setContentView(), чтобы сделать его активным представлением на экране.

Собираем эти три шага вместе:

6. Теперь у нас все готово для доступа к представлениям с идентификаторами в соответствующем макете в экземпляре класса привязки:

binding.textEmail.text = "Satya"
binding.textEmail.setOnClickListener { 
    //Do some awful stuff here
}

Давайте посмотрим, как использовать привязку представления во фрагментах.

7. Добавьте статический Fragment экземпляр в Activity XML под текстовым представлением электронной почты:

8. Привязка вида внутри Fragment аналогична внутренней Activity. Единственное отличие состоит в том, что нам нужно отказаться от объекта привязки в обратном вызове onDestroyView жизненного цикла, потому что экземпляр привязки внутри Fragment привязан к жизненному циклу представления Fragment (между onCreateView и onDestroyView).

Теперь запустите и проверьте приложение. Также проверьте сгенерированный код для лучшего понимания. Полный код можно найти в образце привязки просмотра на GitHub.

Резюме

Привязка представления в некотором роде похожа на синтетику Kotlin (например, доступ к свойствам), но с небольшими дополнительными сведениями по работе с экземплярами привязки и установке корня. Альтернативами синтетике Kotlin являются findViewbyId() и привязка просмотра.

Если вас не беспокоит шаблонный код, нулевая безопасность или безопасность типов, вы можете использовать findViewbyId(). Если вы хотите обновиться до последней версии, следуйте рекомендациям разработчиков Android. Если вас беспокоит шаблонный код, нулевая безопасность и безопасность типов, вы можете использовать привязку представления.

использованная литература