FindViewById () против Butterknife против Kotlin Synthetics против DataBinding против ViewBindings

Более десяти лет разработчики Android боролись с простой, но досадной проблемой. Получение ссылки представления из макетов XML на их классы представления, такие как Activity или Fragments, на совершенно отдельном языке - Java или Kotlin.

Как новичок в Android, я много путался. В Android SDK есть метод: findViewById(). С точки зрения функциональности этот метод выполняет особую задачу - он предоставит вам ссылку на представление в макетах XML, выполнив поиск по его идентификатору. А если ничего не будет найдено, он выдаст вам старый добрый NULL, который, как говорят, является ошибкой его создателя на 1 миллиард долларов.

В этой статье я собираюсь обсудить, как findViewById() развивался с течением времени, и какой лучший подход в «современной разработке Android» для получения ссылки на представление из макетов XML.

Метод findViewById ()

Очевидно, первый - это метод findViewById(). Представленный на уровне API 1, для этого требуется идентификатор, и он возвращает объект View.

У этого подхода есть некоторые проблемы.

  • Если в этом макете есть представление с этим идентификатором, вы не получите никаких ошибок времени компиляции. Скорее вы получите NullPointerException во время выполнения, когда Android не сможет найти представление в Activity, Fragment или ViewGroup.
  • Если представление TextView в XML-макете и вы преобразовываете его как Button, вы не получите никаких ошибок времени компиляции. Вместо этого вы получите ClassCastException, поскольку TextView нельзя преобразовать в Button.

Этот метод широко использовался и используется на протяжении всей эволюции Android SDK. На уровне API 26 compileSdk определение этого метода было немного изменено, чтобы устранить проблему с приведением типов.

Теперь разработчикам не нужно вручную вводить свои представления в код. Если вы ссылаетесь на Button с идентификатором TextView, тогда Android SDK попытается найти Button с предоставленным идентификатором и вернет NULL, потому что не сможет его найти.

Но в Kotlin вам все равно потребуется указать тип типа findViewById<TextView>(R.id.txtUsername). Это может дать вам NullPointerException, если вы не проверяете свои представления на нулевую безопасность, но этот метод не будет бросать ClassCastException, как раньше.

Анализ

  • Типобезопасность: до API 26 не было типобезопасности.
  • Нулевой безопасности: Нет нулевой безопасности. Вам нужно будет проверить представления перед доступом к нулевым значениям.
  • Шаблонный код: много. Вы должны объявить отдельную переменную для всех необходимых вам представлений из XML-макетов.
  • Время сборки: нет разницы во времени сборки.
  • Языки: поддерживает Java и Kotlin.

Нож для масла

Многие разные библиотеки пытались упростить findViewById() использование разными методами. В частности, библиотека Butterknife, созданная Джейком Уортоном, стала очень известной и вызвала огромный интерес разработчиков по всему миру. Это стало своего рода стандартным способом избежать findViewById использования.

Библиотека использует обработку аннотаций и извлекает представления из макетов XML, используя скрытый метод findViewById посредством генерации кода. Он очень прост в использовании и помогает разработчикам сократить шаблонный код.

Он имеет почти те же проблемы, что и findViewById. Однако он добавляет проверку безопасности на ноль во время выполнения, чтобы избежать NullPointerException.

Внимание: этот инструмент больше не поддерживается. Переключитесь на привязку просмотра. Очевидно, что существующие версии будут продолжать работать, но будут рассматриваться только критические исправления ошибок для интеграции с AGP. Разработка функций и исправление общих ошибок остановлены. - Источник: Репозиторий Butterknife на Github

Анализ

  • Типобезопасность: Отсутствует типобезопасность, поскольку используется findViewById.
  • Нулево-безопасный: библиотека проверяет представления на возможность нулевого значения во время выполнения перед доступом.
  • Код шаблона. Уменьшает шаблон, поскольку обработчики аннотаций автоматически генерируют код для вас.
  • Время сборки. На время сборки влияет обработка аннотаций.
  • Языки: поддерживает Java и Kotlin.

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

Android SDK теперь официально является первым продуктом Kotlin. Это означает, что Android SDK сначала будет реализовывать API с точки зрения языка Kotlin, а позже они будут добавлены для Java.

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

Kotlin Synthetics вызывает метод findViewById один раз, а затем по умолчанию кэширует экземпляры представления в HashMap. Эта конфигурация кеша может быть изменена на SparseArray или без кеша через настройки Gradle.

В целом, Kotlin Synthetics - хороший вариант, поскольку он безопасен по типу и требует нулевой проверки с помощью оператора ? Kotlin, если представление присутствует только в некоторых конфигурациях макета. Это не требует от разработчиков дополнительного кода. Но это поддерживается только для проектов Kotlin.

Но есть небольшая проблема, с которой столкнулись многие разработчики при использовании Kotlin Synthetics. Например, если вы установите для представления содержимого макет, а затем введите идентификатор, который существует только в другом макете, IDE позволит вам выполнить автозаполнение и добавить новый оператор импорта. Если разработчик специально не проверит, что его операторы импорта импортируют только правильные представления, не существует безопасного способа убедиться, что это не вызовет проблемы во время выполнения.

Анализ

  • Нулево-безопасный: Обычно нулевой безопасный. Но если идентификатор представления также присутствует / отсутствует в других макетах, тогда разработчик должен явно либо использовать безопасный оператор вызова ?, либо проверять переменную перед использованием. Разработчики могут использовать вид из другого макета, ведущий к NullPointerException.
  • Шаблонный код: Шаблонный код не создается, поскольку методы расширения не создаются. Требуется всего лишь применить android-kotlin-extension плагин в build.gradle один раз.
  • Время сборки: без разницы.
  • Языки: поддерживает только Kotlin.

Связывание данных

Библиотека привязки данных - это вспомогательная библиотека, которая позволяет связывать элементы пользовательского интерфейса в макетах с источниками данных в приложении, используя декларативный стиль, а не программно.

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

Вам придется вручную преобразовать макеты для поддержки привязки данных, вложив их в тег <layout>.

Теперь Android Studio сгенерирует классы для ваших макетов. Например, если имя вашего файла макета activity_main.xml, тогда Android сгенерирует класс ActivityMainBinding либо на Java, либо на Kotlin в соответствии с вашими предпочтениями. Вы можете использовать это для доступа к представлениям без каких-либо NullPointerException или ClassCastException.

Лучшее преимущество использования привязки данных состоит в том, что он позволяет разработчикам сопоставлять данные с представлениями в XML, даже не обращаясь к представлениям в файлах Java / Kotlin. Вы также можете использовать двустороннюю привязку для обновления вашего XML или значения данных без каких-либо прослушивателей или обратных вызовов.

Анализ

  • Код шаблона: требует, чтобы каждый файл макета был вложен в тег <layout>. А также вам нужно будет создать экземпляр автоматически сгенерированного класса привязки и надуть его до вашего Activity или Fragment.
  • Время сборки: увеличивает время сборки, поскольку создает файлы классов макетов. Часто это происходит медленно, потому что вам придется вручную нажимать кнопку «Создать», чтобы обновить / сгенерировать новые классы для ваших макетов.
  • Языки: поддерживает Java и Kotlin.

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

ViewBinding, недавно представленный в Android Studio 3.6, является своего рода подмножеством библиотеки привязки данных. Это сокращает время сборки, поскольку не требуется обработка аннотаций. Не требуется особого внимания к файлам макетов, поскольку они помещаются в теги <layout>. По умолчанию он просто работает со всеми файлами макета.

Единственная разница с привязкой данных заключается в том, что она используется только для ссылок на представления. Он не выполняет никакого сопоставления данных или двусторонней привязки данных.

Вы можете использовать ViewBinding вместо других параметров, если просто ищете хороший подход для получения представлений из файлов макета.

Это работает только в Android Studio 3.6 или более поздних версиях. Вы можете включить его, добавив в build.gradle файл своего приложения.

Затем Android Studio сгенерирует классы привязки просмотра для всех ваших файлов макета. Вы можете использовать эти классы для надувания в Activity или Fragments, как если бы вы это делали в привязке данных.

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

Анализ

  • Шаблонный код. Шаблонный код не создается, поскольку классы привязки представления создаются автоматически. Требуется только один раз включить привязку просмотра в build.gradle.
  • Время сборки: не влияет на скорость сборки. Привязка представления * предназначена для решения проблемы производительности, связанной с использованием привязки данных *, поэтому она не оказывает отрицательного влияния на скорость сборки.
  • Языки: поддерживает Java и Kotlin.

Время принимать решение

Если посмотреть на все варианты и их анализ, View Binding - лучший вариант в настоящее время для использования.

В конце, пожалуйста, Подпишитесь на мой информационный бюллетень DroidUp, чтобы получать больше руководств и советов по разработке Android прямо в свой почтовый ящик.



Если вам понравилась эта статья, вы можете прочитать мои новые статьи ниже:





Ваджахат Карим - выпускник НИТУ, Исламабад, опытный мобильный разработчик, активный участник проекта с открытым исходным кодом и соавтор двух книг Изучение намерений Android и Освоение разработки игр для Android с Unity. . В свободное время он любит проводить время со своей семьей, экспериментировать с кодированием, любит писать о множестве вещей (в основном в блогах и в среде) и является страстным участником проектов с открытым исходным кодом. В июне 2018 года одна из его библиотек заняла первое место в рейтинге Github Trending. Его библиотеки имеют около 2000 звезд на Github и используются в различных приложениях разработчиками по всему миру. Следуйте за ним в Twitter и Medium, чтобы узнавать больше о его работе в области Writing, Android и Open Source.

Кроме того, если у вас есть какие-либо вопросы, на которые вы хотите, чтобы он ответил, свяжитесь с ним через его веб-сайт wajahatkarim.com, указав в теме письма УВАЖАЕМЫЙ ВАДЖАХАТ.

Первоначально опубликовано на https://wajahatkarim.com 1 апреля 2020 г.