Если синтетика Kotlin уходит, не пора ли переходить на альтернативы?
С самого начала разработки Android существовало множество способов доступа к представлениям из файлов макета XML внутри классов для выполнения над ними операций. Давайте рассмотрим эволюцию импорта просмотров.
findViewById
Первоначально мы использовали метод findViewById()
, передав идентификатор представления для доступа к представлению. Это добавило много шаблонного кода во все файлы классов, которые раздували макеты. Многократное написание этих строк кода только для того, чтобы найти представления, было неинтересно и неудобно.
Синтаксис
TextView emailTextView;
emailTextView = (TextView) findViewById(R.id.txt_email);
R.id.txt_email
означает представление, которое определено в любом макете с идентификаторомtxt_email
.R
- это класс в Android, у которого есть набор всех идентификаторов представлений.findViewById
- это метод, который используется для поиска представления в файле ресурсов макета, который прикреплен к текущему действию.
К недостаткам можно отнести:
NullPointerException
иClassCastException
не приводят к нулевой безопасности или безопасности типов.- Больше шаблонного кода.
ButterKnife
После нескольких лет борьбы мы перешли на ButterKnife , библиотеку на основе аннотаций, чтобы упростить доступ к представлениям. ButterKnife - это библиотека для инъекций представлений для Android. Мы должны интегрировать зависимость в файл gradle
, а затем использовать соответствующие аннотации для доступа к представлениям.
К недостаткам можно отнести:
- Это тоже не было захватывающим. Хотя мы уменьшили количество строк, шаблонный код по-прежнему присутствует во всех файлах классов вверху.
- Трассировку стека было немного трудно читать.
- Он устарел, а разработка функций и исправление общих ошибок остановлены.
Теперь о синтетике 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.
Действия, которые необходимо выполнить:
- Включите привязку представления в
build.gradle
(дополнительных зависимостей не требуется). - Он генерирует класс привязки для каждого макета XML, присутствующего в этом модуле.
- Экземпляр класса привязки содержит прямые ссылки на все представления, имеющие идентификатор в соответствующем макете.
Настраивать
Привязка представления - это конфигурация на уровне модуля, аналогичная расширениям 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
.
Чтобы увидеть полную базу кода, пожалуйста, проверьте просмотр образца привязки.
- Создайте новый проект в Android Studio: File → New Project →…
- Включите привязку представления в файле
build.gradle
уровня приложения:
android{ ...... buildFeatures { viewBinding true } }
3. Перестройте проект и проверьте сгенерированную папку на предмет сгенерированного класса привязки или найдите имя класса, нажав двойную смену. Имя класса привязки - это имя файла макета в случае Паскаля со словом Binding
, добавленным в конец. В моем случае это ActivityMainBinding
, который выглядит так:
4. Теперь мой ActivityMainBinding
class содержит свойства для каждого представления с идентификатором в макете. Итак, давайте добавим текстовое представление с идентификатором text_email
в файл макета и перестроим проект. Затем мы проверим файл ActivityMainBinding
на наличие изменений:
5. Нам нужно выполнить три следующих шага, чтобы получить доступ к экземпляру класса привязки и установить для представления Activity
:
- Нам нужно вызвать статический метод
inflate()
, включенный в сгенерированныйActivityMainBinding
class. Это создает экземпляр или объект класса привязки для использованияActivity
. - Затем получите ссылку на корневое представление, вызвав метод
getRoot()
или используя синтаксис свойств Kotlin. - Наконец, установите для корневого представления значение
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. Если вас беспокоит шаблонный код, нулевая безопасность и безопасность типов, вы можете использовать привязку представления.