- Kotlin Android Extensions: полное руководство
- Что такое Kotlin Android Extensions?
- Как этим пользоваться
- Включаем Kotlin Android Extensions в наш код
- Восстанавливаем view из XML
- Магия Kotlin Android Extensions
- Kotlin Android Extensions ― работа с фрагментами
- Kotlin Android extensions и Custom View
- Восстанавливаем views из другого view
- Kotlin Android Extensions версии 1.1.4
- Применяем на ViewHolder (или любом пользовательском классе)
- Kotlin Android Extension. Реализация Parcelable
- Настройка кэша
- Заключение
- Kotlin Android Extensions deprecated. Что делать? Инструкция по миграции
- Кратко о Kotlin Android Extensions
- Проблемы Kotlin Android Extensions
- Альтернативные способы
- View Binding от Google
- Начало работы с View Binding
- Использование в Activity
- Используем Kotlin в своем Android-проекте
- Подготовка
- 1. Установка плагинов Kotlin
- 2. Создание Activity на Kotlin
- 3. Использование Kotlin
- 4. Использование расширения Android Kotlin
- 5. Конвертация Java в Kotlin
- Видеоверсия урока
- Заключение
Kotlin Android Extensions: полное руководство
Эта статья была впервые опубликована на antonioleiva.com и является частью книги Kotlin for Android Developers.
Если у вас уже есть опыт разработки приложений для Android, вероятно, вы уже устали использовать findViewById, чтобы восстанавливать view. Или, может быть, вы уже сдались и начали использовать известную библиотеку ― Butterknife. Если это ваш случай, то вы влюбитесь в Kotlin Android Extensions.
Что такое Kotlin Android Extensions?
Kotlin Android Extensions — это плагин для Kotlin, который включён в стандартный пакет. Он позволяет восстанавливать view из Activities, Fragments, и Views удивительно-бесшовным способом.
Плагин генерирует дополнительный код, который позволяет получить доступ к view в виде XML, так же, как если бы вы имели дело с properties с именем id, который вы использовали при определении структуры.
Также он создаёт локальный кэш view. При первом использовании свойства, плагин выполнит стандартный findViewById. В последующем, view будет восстановлен из кэша, поэтому доступ к нему будет быстрее.
Как этим пользоваться
Посмотрим, насколько это просто. В первом примере рассмотрим activity:
Включаем Kotlin Android Extensions в наш код
Хотя плагин уже интегрирован (устанавливать новый не нужно), если вы хотите его использовать, вам нужно подключить плагин в модуль Android:
И это все что вам потребуется. Теперь вы можете начать работу с ним.
Восстанавливаем view из XML
С этого момента, восстановить view, также просто, как использовать view id, которое вы определили в XML, непосредственно в вашем activity.
Представьте, что у вас есть такой XML:
Как видно, в TextView есть id welcomeMessage .
Просто напишите следующий код в MainActivity:
Чтобы это работало, нужен специальный импорт (я написал его ниже), но IDE может автоматически импортировать его. Проще и быть не может!
Как я уже упоминал, сгенерированный код включает кэш view, поэтому, если вы повторно обратитесь к view, это не потребует выполнения findViewById снова.
Давайте посмотрим, что происходит под капотом.
Магия Kotlin Android Extensions
Когда начинаешь работать с Kotlin, действительно интересно понять байт-код, который генерируется при использовании той или иной функции. Это поможет вам понять скрытую цену ваших решений.
В меню Tools → Kotlin, вы найдёте мощный инструмент Show Kotlin Bytecode. Если кликнуть по нему, вы увидите байт-код, который будет сгенерирован, когда открытый файл класса будет скомпилирован.
Для большинства людей, байт-код не особенно полезен, но тут есть ещё одна опция: Decompile.
Эта опция покажет вам Java репрезентацию байт-кода, который был сгенерирован в Kotlin. Так, вы сможете более-менее понять, как будет выглядеть код Java, эквивалентный тому, что вы написали на Kotlin.
Я собираюсь использовать это на примере activity и посмотреть код, сгенерированный Kotlin Android Extensions.
Вот интересная часть:
Это и есть кэш view, о котором мы говорили.
При запросе view, его поиск начинается в кэше. Если view нет в кэше, то он туда будет добавлен, как только будет найден. Всё просто.
Кроме того, в код добавляется функция для очистки кэша: clearFindViewByIdCache. Её можно использовать, скажем, когда старые view уже не актуальны и вам нужно получить новые.
Тогда, эта строка:
Превращается в эту:
Таким образом, плагин не генерирует свойства для каждого view, это ненастоящие свойства. Плагин просто заменяет код во время компиляции, чтобы получить доступ к кэшу view. Затем, он приводит к нужному типу и вызывает метод.
Kotlin Android Extensions ― работа с фрагментами
Этот плагин можно использовать с фрагментами.
Проблема с фрагментами заключается в том, что view может обновится, а экземпляр фрагмента останется прежним. Что произойдёт? А то, что view находящееся в кэше, перестанет быть валидным.
Давайте посмотрим код, который генерирует плагин, если мы используем его с фрагментом. Я создаю простой фрагмент, который использует тот же XML, который я написал выше:
В onViewCreated , я снова изменяю текст TextView . Что насчёт сгенерированного байт-кода?
Всё тоже самое, как и в activity, с небольшой разницей:
Когда view перестанет быть актуальным, этот метод вызовет clearFindViewByIdCache , так что мы в безопасности!
Kotlin Android extensions и Custom View
С custom view, плагин работает схожим образом. Скажем, у нас есть такой view:
Я создаю очень простое custom view и генерирую конструкторы с новым намерением, которое использует аннотацию @JvmOverloads :
В примере выше, я изменяю текст в itemTitle . Сгенерированный код должен искать view в кэше. Не имеет смысла снова копировать тот же код полностью. Вы можете наблюдать это в строке, которая изменяет текст:
Отлично! В custom views мы тоже вызываем findViewById только первый раз.
Восстанавливаем views из другого view
Последняя альтернатива, которую предлагает Kotlin Android Extensions: использовать свойства напрямую из другого view.
Я использую схему, схожую с той, что была в предыдущем разделе. Представьте, что это было закачано в адаптер для примера.
Вы также можете получить доступ к subviews напрямую, просто используя этот плагин:
Хотя плагин и может помочь заполнить import, здесь есть небольшое отличие:
Несколько вещей, которые вам нужно знать:
- Во время компиляции, вы можете ссылаться на любое view из любого другого view. Это значит, вы можете ссылаться на view, которое не является его прямым потомком. Это плохо скажется на времени выполнения при попытке восстановить view, которого не существует.
- В этом случае, view не кэшировано, как в случае с Activities и Fragments.
Почему так? В отличие от предыдущих случаев, здесь у плагина нет места, чтобы генерировать необходимый код для кэша.
Если вы снова перечитаете код, который сгенерирован плагином, где вызываются свойства из view, вы увидите это:
Как видно, здесь нет запроса к кэшу. Будьте осторожны, если у вас комплексное view, и вы используете его в адаптере. Это может повлиять на производительность.
Также у вас есть альтернатива: Kotlin 1.1.4
Kotlin Android Extensions версии 1.1.4
Начиная с этой, новой версии Kotlin, в Android Extensions включили новые интересные функции: кэш в любом классе (включая ViewHolder ) и новая аннотация, названная @Parcelize . Также есть способ настраивать сгенерированный кэш.
Мы вернёмся к ним через минуту, но вам следует знать, что эти новые фичи ― не завершены, так что, вам нужно включить их с помощью build.gradle :
Применяем на ViewHolder (или любом пользовательском классе)
Теперь есть простой способ построить кэш для любого класса. Единственное требование заключается в том, чтобы класс имплементировал интерфейс LayoutContainer . Этот интерфейс предоставит view, которое плагин будет использовать, чтобы искать subviews. Представьте, что у вас есть ViewHolder, который содержит view со структурой, описанной в предыдущем примере. Всё что вам нужно сделать:
containerView ― единственное, что мы перезаписываем из интерфейса LayoutContainer . Это все что вам необходимо.
С этого момента, у вас есть доступ к views напрямую. Нет необходимости присоединять itemView, чтобы получить доступ к subviews.
Ещё раз, если вы посмотрите на сгенерированный код, вы увидите, что view берётся из кэша:
Здесь я применял его на ViewHolder , но это достаточно универсальный подход и его можно использовать с любым классом.
Kotlin Android Extension. Реализация Parcelable
С новой аннотацией @Parcelize , можно с лёгкостью имплементировать Parcelable c любым классом.
Вам нужно добавить аннотацию, а плагин сделает за вас всю сложную работу:
Далее, как вам должно быть известно, можно добавить объект к любому намерению:
И восстановить объект из намерения в любой точке (в этом случае: из activity):
Настройка кэша
В этот экспериментальный набор, включена новая фича ― аннотация @ContainerOptions . Она даёт возможность настраивать способ построения кэша, или даже предотвращать его создание классом.
По умолчанию, используется Hashmap , как мы видели ранее. Его можно заменить на SparseArray из Android framework, что может быть более эффективно в некоторых ситуациях. Или, если вам не нужен кэш для класса, по каким-то причинам, такая возможность тоже есть.
Вот как это использовать:
На данный момент существуют следующие варианты:
Заключение
Вы увидели, как легко работать с Android views в Kotlin. Благодаря простому плагину, можно забыть обо всём этом ужасном коде, связанном с восстановлением view. Этот плагин создаёт для нас необходимые свойства с приведением правильного типа, безо всяких проблем.
Кроме того, Kotlin 1.1.4 добавляет интересные фичи, которые будут действительно полезны в некоторых случаях, к которым плагин ранее не имел отношения.
Источник
Kotlin Android Extensions deprecated. Что делать? Инструкция по миграции
kotlinx.android.synthetic is no longer a recommended practice. Removing in favour of explicit findViewById
Кратко о Kotlin Android Extensions
Kotlin Android Extensions — это плагин для Kotlin, позволяющий восстанавливать view из Activities, Fragments, и Views без написания стандартного бойлерплэйт-кода типа findViewById.
Плагин генерирует дополнительный код, который позволяет получить доступ к view в виде XML, так же, как если бы вы имели дело с properties с именем id, который вы использовали при определении структуры.
Также он создаёт локальный кэш view. При первом использовании свойства, плагин выполнит стандартный findViewById. В последующем, view будет восстановлен из кэша, поэтому доступ к нему будет быстрее.
Если это всё так удобно, то зачем его сделали deprecated?
Проблемы Kotlin Android Extensions
Альтернативные способы
View Binding от Google
Итак, победителем в этом списке выглядит ViewBinding от Google (не путайте с DataBinding). Давайте кратко рассмотрим, что это такое.
View Binding — это инструмент, который позволяет проще писать код для взаимодействия с view. При включении View Binding в определенном модуле он генерирует binding классы для каждого файла разметки (layout) в модуле. Объект сгенерированного binding класса содержит ссылки на все view из файла разметки, для которых указан android:id
Главные преимущества View Binding — это Null safety и Type safety.
Начало работы с View Binding
Начать работать с ViewBinding достаточно просто. Нужно добавить опцию в build.gradle:
После этого можно уже использовать. Каждый сгенерированный binding класс содержит ссылку на корневой view разметки (root) и ссылки на все view, которые имеют id. Имя генерируемого класса формируется как «название файла разметки», переведенное в camel case + «Binding». Например, для файла разметки result_profile.xml:
Будет сгенерирован класс ResultProfileBinding, содержащий 2 поля: TextView name и Button button.
Использование в Activity
Например у вас вот такой layout:
Результат работы ViewBinding:
Использовать viewBinding можно так:
И теперь, после того, как получили ссылки на view:
Если вы используете ViewBinding во фрагменте и держите ссылку на binding во фрагменте (а не только в методе onCreateView()) то не забывайте очищать ссылки в методе onDestroyView().
Это необходимо делать из-за жизненного цикла фрагмента и view:
Источник
Используем Kotlin в своем Android-проекте
Kotlin — язык программирования с открытым исходным кодом от компании JetBrains, становится все более популярным среди Java-разработчиков. Совместимый с Java, он предлагает более богатый опыт разработки за счет своей современности, выразительности и лаконичности.
Если вы следите за альтернативными языками программирования для разработки под Android, Вы должны попробовать Kotlin. Он может быть использован вместе с Java в ваших Android-проектах.
В этом уроке я покажу вам как использовать Kotlin и плагины Kotlin в Android Studio.
Подготовка
Чтобы следовать вместе со мной, вы должны иметь:
— последняя версия Android Studio
— базовое понимания синтаксиса Kotlin
1. Установка плагинов Kotlin
В Android Studio выбираем Configure > Plugins.
На следующем экране нажимаем на кнопку Install JetBrains plugin… внизу.
Выбираем Kotlin Extensions For Android из списка и нажмите Install Plugin справа.
Так как плагин зависит от плагина Kotlin, студия справшивает можно ли установить его. Нажмите Yes для начала установки.
После завершения установки, перезапустите Android Studio для активации плагинов.
2. Создание Activity на Kotlin
В Android Studio нажмите правой кнопкой мыши на имени вашего пакета и выберите New > Kotlin File.
В диалоговом окне, введите имя новой Activity и выберите Class из выпадающего списка. Я назвал свой класс MainActivity.
После того, как класс был создан, вы увидите предупреждение о том, чтобы вы настроили модуль приложения для поддержки Kotlin.
В алерте нажмте на ссылку и во всплывающем окне нажмите OK для выбора значений по умолчанию.
Для настройки поддержки Kotlin в вашем проекте, плагин Kotlin сделает некоторые изменения в файле build.gradle. Примените изменения настроек нажатием на кнопку Sync Now сверху.
На этом шаге настройка проекта завершена. Вернитесь к вашему Kotlin-классу для начала кодинга.
3. Использование Kotlin
Для упрощения примера я покажу как создал Activity с одним единственным TextView, отображающим строку.
Убедитесь, что ваш класс является подклассом Activity и переопределен метод onCreate. Ваш класс должен выглядеть так:
Создайте экземпляр класса TextView как локальную переменную с помощью ключевого слова val:
Вызовите метод setText у TextView для установки текста и установите его как layout с помощью метода setContentView.
Также как и Activity на Java, вам нужно объявить вашу Kotlin-Activity в AndroidManifest.xml. Вот так выглядит объявление Activity в манифесте:
Теперь вы можете скомпилировать и запустить приложение на вашем Android-устройстве или эмуляторе. Хотя компилятор Kotlin немного медленнее, чем Java, вы вряд ли ощутите особую разницу во время сборки вашего проекта.
4. Использование расширения Android Kotlin
Для того, чтобы использовать плагин в вашем приложении добавьте в файл build.gradle зависимость org.jetbrains.kotlin:kotlin-android-extensions как указано ниже. Не забудьте также нажать кнопку Sync Now:
С помощью этого расширения вы можете забыть про findViewById. Плагин все сделает за вас. Плагин сканирует XML-файл вашего лейаута, и по id виджетов создает в вашей Activity переменные такого же типа и с именем совпадающим с id виджета. Небольшой пример:
У нас есть TextView с id myMessage. Создайте Kotlin-активити и переопределите метод onCreate:
Вызовите метод setContentView и передайте id вашего лейаута:
Вместо вызова findViewById вы можете импортировать ваш TextView и использовать его как обычную переменную:
Если вы хотите импортировать все виджеты, вместо myMessage нужно написать *:
Теперь вы можете использовать TextView в вашей Activity:
5. Конвертация Java в Kotlin
Вы можете использовать плагин Kotlin, для преобразования Java-классов классы Kotlin. Чтобы попробовать эту функцию , создайте новый Java-класс со следующей реализации. Это простая активити, которая селадывает два числа.
Преобразуйте Java-класс в класс Kotlin, нажатием Control+Alt+Shift+J, или с помощью меню, выбрав Code > Convert Java File to Kotlin File.
После конвертации ваш класс будет выглядеть так:
Также вы можете заметить, что расширение файла поменялось с .java на .kt.
Видеоверсия урока
Заключение
В этом уроке мы научились использовать Kotlin в ваших Andoid-проектах. Java и Kotlin могут использоваться вместе в одном проекте. Если вы только изучаете Kotlin, то лучше использовать его постепенно.
Источник