Kotlin android extensions как подключить
Перейти к содержимому

Kotlin android extensions как подключить

  • автор:

Kotlin Android Extensions: полное руководство

Если у вас уже есть опыт разработки приложений для 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:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

И это все что вам потребуется. Теперь вы можете начать работу с ним.

Восстанавливаем view из XML

С этого момента, восстановить view, также просто, как использовать view id, которое вы определили в XML, непосредственно в вашем activity.

Представьте, что у вас есть такой XML:


xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/welcomeMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Hello World!"/>

Как видно, в TextView есть id welcomeMessage .

Просто напишите следующий код в MainActivity:

override fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState) 
setContentView(R.layout.activity_main)
welcomeMessage.text = "Hello Kotlin!"
>

Чтобы это работало, нужен специальный импорт (я написал его ниже), но IDE может автоматически импортировать его. Проще и быть не может!

import kotlinx.android.synthetic.main.activity_main.*

Как я уже упоминал, сгенерированный код включает кэш view, поэтому, если вы повторно обратитесь к view, это не потребует выполнения findViewById снова.

Давайте посмотрим, что происходит под капотом.

Магия Kotlin Android Extensions

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

В меню Tools → Kotlin, вы найдёте мощный инструмент Show Kotlin Bytecode. Если кликнуть по нему, вы увидите байт-код, который будет сгенерирован, когда открытый файл класса будет скомпилирован.

Для большинства людей, байт-код не особенно полезен, но тут есть ещё одна опция: Decompile.

Эта опция покажет вам Java репрезентацию байт-кода, который был сгенерирован в Kotlin. Так, вы сможете более-менее понять, как будет выглядеть код Java, эквивалентный тому, что вы написали на Kotlin.

Я собираюсь использовать это на примере activity и посмотреть код, сгенерированный Kotlin Android Extensions.

Вот интересная часть:

private HashMap _$_findViewCache;
.
public View _$_findCachedViewById(int var1) if(this._$_findViewCache == null) this._$_findViewCache = new HashMap();
>
View var2 = (View)this._$_findViewCache.get(Integer.valueOf(var1));
if(var2 == null) var2 = this.findViewById(var1);
this._$_findViewCache.put(Integer.valueOf(var1), var2);
>
return var2;
>
public void _$_clearFindViewByIdCache() if(this._$_findViewCache != null) this._$_findViewCache.clear();
>
>

Это и есть кэш view, о котором мы говорили.

При запросе view, его поиск начинается в кэше. Если view нет в кэше, то он туда будет добавлен, как только будет найден. Всё просто.

Кроме того, в код добавляется функция для очистки кэша: clearFindViewByIdCache. Её можно использовать, скажем, когда старые view уже не актуальны и вам нужно получить новые.

Тогда, эта строка:

welcomeMessage.text = "Hello Kotlin!"

Превращается в эту:

((TextView)this._$_findCachedViewById(id.welcomeMessage)).setText((CharSequence)"Hello Kotlin!");

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

Kotlin Android Extensions ― работа с фрагментами

Этот плагин можно использовать с фрагментами.

Проблема с фрагментами заключается в том, что view может обновится, а экземпляр фрагмента останется прежним. Что произойдёт? А то, что view находящееся в кэше, перестанет быть валидным.

Давайте посмотрим код, который генерирует плагин, если мы используем его с фрагментом. Я создаю простой фрагмент, который использует тот же XML, который я написал выше:

class Fragment : Fragment() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? return inflater.inflate(R.layout.fragment, container, false) 
>
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) super.onViewCreated(view, savedInstanceState)
welcomeMessage.text = "Hello Kotlin!"
>
>

В onViewCreated , я снова изменяю текст TextView . Что насчёт сгенерированного байт-кода?

Всё тоже самое, как и в activity, с небольшой разницей:

// $FF: synthetic method
public void onDestroyView() super.onDestroyView();
this._$_clearFindViewByIdCache();
>

Когда view перестанет быть актуальным, этот метод вызовет clearFindViewByIdCache , так что мы в безопасности!

Kotlin Android extensions и Custom View

С custom view, плагин работает схожим образом. Скажем, у нас есть такой view:

 android:orientation="vertical" 
android:layout_width="match_parent"
android:layout_height="match_parent">

android:id="@+id/itemImage"
android:layout_width="match_parent"
android:layout_height="200dp"/>

android:id="@+id/itemTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

Я создаю очень простое custom view и генерирую конструкторы с новым намерением, которое использует аннотацию @JvmOverloads :

class CustomView @JvmOverloads constructor( 
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) init LayoutInflater.from(context).inflate(R.layout.view_custom, this, true)
itemTitle.text = "Hello Kotlin!"
>
>

В примере выше, я изменяю текст в itemTitle . Сгенерированный код должен искать view в кэше. Не имеет смысла снова копировать тот же код полностью. Вы можете наблюдать это в строке, которая изменяет текст:

((TextView)this._$_findCachedViewById(id.itemTitle)).setText((CharSequence)"Hello Kotlin!");

Отлично! В custom views мы тоже вызываем findViewById только первый раз.

Восстанавливаем views из другого view

Последняя альтернатива, которую предлагает Kotlin Android Extensions: использовать свойства напрямую из другого view.

Я использую схему, схожую с той, что была в предыдущем разделе. Представьте, что это было закачано в адаптер для примера.

Вы также можете получить доступ к subviews напрямую, просто используя этот плагин:

val itemView = . 
itemView.itemImage.setImageResource(R.mipmap.ic_launcher)
itemView.itemTitle.text = "My Text"

Хотя плагин и может помочь заполнить import, здесь есть небольшое отличие:

import kotlinx.android.synthetic.main.view_item.view.*

Несколько вещей, которые вам нужно знать:

  • Во время компиляции, вы можете ссылаться на любое view из любого другого view. Это значит, вы можете ссылаться на view, которое не является его прямым потомком. Это плохо скажется на времени выполнения при попытке восстановить view, которого не существует.
  • В этом случае, view не кэшировано, как в случае с Activities и Fragments.

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

Если вы снова перечитаете код, который сгенерирован плагином, где вызываются свойства из view, вы увидите это:

((TextView)itemView.findViewById(id.itemTitle)).setText((CharSequence)"My Text");

Как видно, здесь нет запроса к кэшу. Будьте осторожны, если у вас комплексное view, и вы используете его в адаптере. Это может повлиять на производительность.

Также у вас есть альтернатива: Kotlin 1.1.4

Kotlin Android Extensions версии 1.1.4

Начиная с этой, новой версии Kotlin, в Android Extensions включили новые интересные функции: кэш в любом классе (включая ViewHolder ) и новая аннотация, названная @Parcelize . Также есть способ настраивать сгенерированный кэш.

Мы вернёмся к ним через минуту, но вам следует знать, что эти новые фичи ― не завершены, так что, вам нужно включить их с помощью build.gradle :

androidExtensions experimental = true
>

Применяем на ViewHolder (или любом пользовательском классе)

Теперь есть простой способ построить кэш для любого класса. Единственное требование заключается в том, чтобы класс имплементировал интерфейс LayoutContainer . Этот интерфейс предоставит view, которое плагин будет использовать, чтобы искать subviews. Представьте, что у вас есть ViewHolder, который содержит view со структурой, описанной в предыдущем примере. Всё что вам нужно сделать:

class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), 
LayoutContainer fun bind(title: String) itemTitle.text = "Hello Kotlin!"
>
>

containerView ― единственное, что мы перезаписываем из интерфейса LayoutContainer . Это все что вам необходимо.

С этого момента, у вас есть доступ к views напрямую. Нет необходимости присоединять itemView, чтобы получить доступ к subviews.

Ещё раз, если вы посмотрите на сгенерированный код, вы увидите, что view берётся из кэша:

((TextView)this._$_findCachedViewById(id.itemTitle)).setText((CharSequence)"Hello Kotlin!");

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

Kotlin Android Extension. Реализация Parcelable

С новой аннотацией @Parcelize , можно с лёгкостью имплементировать Parcelable c любым классом.

Вам нужно добавить аннотацию, а плагин сделает за вас всю сложную работу:

@Parcelize
class Model(val title: String, val amount: Int) : Parcelable

Далее, как вам должно быть известно, можно добавить объект к любому намерению:

val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(DetailActivity.EXTRA, model)
startActivity(intent)

И восстановить объект из намерения в любой точке (в этом случае: из activity):

val model: Model = intent.getParcelableExtra(EXTRA)

Настройка кэша

В этот экспериментальный набор, включена новая фича ― аннотация @ContainerOptions . Она даёт возможность настраивать способ построения кэша, или даже предотвращать его создание классом.

По умолчанию, используется Hashmap , как мы видели ранее. Его можно заменить на SparseArray из Android framework, что может быть более эффективно в некоторых ситуациях. Или, если вам не нужен кэш для класса, по каким-то причинам, такая возможность тоже есть.

Вот как это использовать:

@ContainerOptions(CacheImplementation.SPARSE_ARRAY)
class MainActivity : AppCompatActivity() .
>

На данный момент существуют следующие варианты:

public enum class CacheImplementation SPARSE_ARRAY, 
HASH_MAP,
NO_CACHE;
.
>

Заключение

Вы увидели, как легко работать с Android views в Kotlin. Благодаря простому плагину, можно забыть обо всём этом ужасном коде, связанном с восстановлением view. Этот плагин создаёт для нас необходимые свойства с приведением правильного типа, безо всяких проблем.

Кроме того, Kotlin 1.1.4 добавляет интересные фичи, которые будут действительно полезны в некоторых случаях, к которым плагин ранее не имел отношения.

How to use Kotlin Android Extensions in Android Apps

Иконка канала Кotlin Тренды

How to use Kotlin Android Extensions in Android Apps Take your app to the top keyword installs: http://bit.ly/2Xyg176 Recommended way to get genuine real and safest reviews: http://bit.ly/2XDZlpD Recommended way to boost your apps ranking: http://bit.ly/2G3nMa7 Recommended Best Ads Mediation Network: http://bit.ly/2JpoeSl Recommended book about the app market: https://amzn.to/2JDjojo Subscribe To My Channel and Get More Great Tutorials http://www.youtube.com/subscription_center?add_user=sandeepbhandari1 This tutorial describes how to use android kotlin extensions library through the following steps: 1) We create a new project in an android studio with new project wizard and enable support of kotlin in our project. 2) The android kotlin extensions library is already added to the project when creating new project. 3) We use android kotlin extensions library with activity and fragments, then we deploy and run the app to the android emulator. 4) We use android kotlin extensions library with Custom Views and view Holder, then we deploy and run the app to the android emulator. 5) Finally we use android kotlin extensions library with Parcelable to pass objects with intents, the we deploy and run the app to the android emulator. Notes: — Android kotlin extensions library are a kotlin plugins that we can enable in kotlin android studio project and use its features to eliminate boilerplate code (findViewById calls). It helps us to access the views directly and access their methods as they are properties of them. It can aslo considered as alternative to ButterKnife Library which is Basic Usage of DataBinding Library. — ButterKnife: it’s a library developed and maintained by jake warton (Square Inc.), has annotations that help developers to instantiate the views from our activity or fragment. It also has annotations to handle events like onClick(), onLongClick(), etc. http://www.indragni.com/android/KotlinExtensions.zip ►Android Developer Figurine◄ ►Android Mini Collectible Figure (India): http://amzn.to/2CQRMXp ►Android Mini Collectible Figure (US): http://amzn.to/2CNO8Kk ►Android Mini Collectible Figures (India): http://amzn.to/2CRanmh ►Android Mini Collectible Figures (US): http://amzn.to/2CN6bmI ►New and Updated Android ASO Book◄ ►Ultimate Guide to Android ASO: Boost android app (India): https://www.amazon.in/Ultimate-Guide-Android-ASO-android-ebook/dp/B0156P9YEQ ►Ultimate Guide to Android ASO: Boost android app (US): https://www.amazon.com/Ultimate-Guide-Android-ASO-android-ebook/dp/B0156P9YEQ ►Android Developer Books◄ ►For Beginners◄ ►Head First Android Development (India): http://amzn.to/2CQlZpB ►Head First Android Development (US): http://amzn.to/2lNRjtC ►Android Programming for Beginners (India): http://amzn.to/2CR6dKU ►Android Programming for Beginners (US): http://amzn.to/2F8zZsg ►Mastering Android Development with Kotlin (India): http://amzn.to/2m9R8tp ►Mastering Android Development with Kotlin (US): http://amzn.to/2F5ATFX ►Learning Java by Building Android Games (India): http://amzn.to/2CRaX3r ►Learning Java by Building Android Games (US): http://amzn.to/2CYYS8W ►For Experts◄ ►Expert Android Programming (India): http://amzn.to/2D4MCUD ►Expert Android Programming (US): http://amzn.to/2CXf8qV ►Android Programming: The Big Nerd Ranch Guide (India): http://amzn.to/2Fbb7Qw ►Android Programming: The Big Nerd Ranch Guide (US): http://amzn.to/2F4LbWJ ►Android Cookbook (India): http://amzn.to/2COhzys ►Android Cookbook (US): http://amzn.to/2CHSmG3 ►Murach’s Android Programming (India): http://amzn.to/2AB7GPL ►Murach’s Android Programming (US): http://amzn.to/2F4n76a ►Mastering Android NDK (India): http://amzn.to/2CMLY0S ►Mastering Android NDK (US): http://amzn.to/2F4M3KZ ►Android High Performance Programming (India): http://amzn.to/2Fc2Vzh ►Android High Performance Programming (US): http://amzn.to/2qAruCQ ►Advanced Android Application Development (India): http://amzn.to/2D3uvhv ►Advanced Android Application Development (US): http://amzn.to/2CzoBDM ►Android Developer Gadgets◄ ►USB C Cable (India): http://amzn.to/2ACjEIw ►USB C Cable (US): http://amzn.to/2F2dZ22 ►Anker Micro USB to USB C Adapter (India): http://amzn.to/2F9SFrD ►Anker Micro USB to USB C Adapter (US): http://amzn.to/2CzEFFH ►Samsung Gear S3 Frontier (India): http://amzn.to/2COVfWm ►Samsung Gear S3 Frontier (US): http://amzn.to/2D1A4gL ►Sony Android Auto Media Receiver (India): http://amzn.to/2m9ripv ►Sony Android Auto Media Receiver (US): http://amzn.to/2Ef7SX9 How to use Kotlin Android Extensions in Android Apps

Показать больше

Войдите , чтобы оставлять комментарии

Kotlin Android Extensions deprecated. Что делать?Инструкция по миграции

Безусловно, это было очень удобно, особенно если у вас проект полностью на Kotlin. Однако, мир меняется и теперь нужно искать альтернативы. В этой статье мы кратко рассмотрим, что такое плагин Kotlin Android Extension, какие были проблемы с ним и что теперь нам, Android-разработчикам делать. Частично, использовался материал этой статьи. Итак, поехали.

Кратко о Kotlin Android Extensions

Kotlin Android Extensions — это плагин для Kotlin, позволяющий восстанавливать view из Activities, Fragments, и Views без написания стандартного бойлерплэйт-кода типа findViewById.

Плагин генерирует дополнительный код, который позволяет получить доступ к view в виде XML, так же, как если бы вы имели дело с properties с именем id, который вы использовали при определении структуры.

Также он создаёт локальный кэш view. При первом использовании свойства, плагин выполнит стандартный findViewById. В последующем, view будет восстановлен из кэша, поэтому доступ к нему будет быстрее.

Если это всё так удобно, то зачем его сделали deprecated?

Проблемы Kotlin Android Extensions

  • Используется глобальный нэйминг идентификаторов. Могут возникнуть ситуации, когда один и тот же идентификатор имеется у разных view в разных лэйаутах — соответственно только на этапе работы приложения вы узнаете о том, что использовали не тот id.
  • Возможно использовать только в проектах на Kotlin (кэп)
  • Отсутствует Null Safety. В случае, когда view представлена в одной конфигурации и отсутствует в другой — может возникнуть краш, т.к отсутствует обработка таких ситуаций
  • Невозможно использовать в многомодульных проектах. Очень распространённый сценарий: у вас есть модуль UI Kit, хранящий общие UI-компоненты, которые вы хотите переиспользовать в других модулях. До сих пор висит issues которое вряд ли поправят. В таком сценарии обычно используют старый добрый findViewById ��
  • Резюмируя приведённые недостатки, нетрудно понять, что этот подход не идеален — хотя, безусловно, очень удобен на небольших проектах. На больших проектах с многомодульной архитектурой и сотнями экранов — использование Kotlin Android Extensions уже не кажется идеальным решением.

Альтернативные способы

  • Использование KotterKnife (кек, даже не думайте).
  • Старый добрый FindViewById() — уже получше, но так себе.
  • Использование AndroidAnnotations (привет из 2015)
  • View Binding от Google — бинго!

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:

android < . buildFeatures < viewBinding true >>

После этого можно уже использовать.

Каждый сгенерированный binding класс содержит ссылку на корневой view разметки ( root ) и ссылки на все view, которые имеют id. Имя генерируемого класса формируется как “название файла разметки”, переведенное в camel case + “Binding”.

Например, для файла разметки result_profile.xml :

Будет сгенерирован класс ResultProfileBinding , содержащий 2 поля: TextView name и Button button .

Использование в Activity

Например у вас вот такой layout:

Результат работы ViewBinding:

public final class ActivityMainBinding implements ViewBinding < @NonNull private final ConstraintLayout rootView; @NonNull public final TextView textView;

Использовать viewBinding можно так:

private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?)

И теперь, после того, как получили ссылки на view:

binding.name.text = viewModel.name binding.button.setOnClickListener

Если вы используете ViewBinding во фрагменте и держите ссылку на binding во фрагменте (а не только в методе onCreateView()) то не забывайте очищать ссылки в методе onDestroyView(). Пример:

private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? < _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view >override fun onDestroyView()

Это необходимо делать из-за жизненного цикла фрагмента и view:

В целом, переключиться на ViewBinding достаточно не сложно, хотя и жаль, что Kotlin Android Extensions объявлен deprecated. А я напоминаю, что на практическом онлайн-интенсиве по Android-разработке -вы можете быстро освоить современную Android-разработку с наставником.

Подписывайся на канал чтобы не пропустить анонс

Понравилась статья? Не забудь подписаться и поставить лайк, а ещё

  • Онлайн — интенсив по Android-разработке с code review
  • Не забудьте присоединиться к нам в Telegram — на канале @android_school_ru публикуются полезные материалы для Android-разработчика и скидки на продвинутые курсы

Kotlin Android Extensions deprecated. Что делать? Инструкция по миграции

Безусловно, это было очень удобно, особенно если у вас проект полностью на Kotlin. Однако, мир меняется и теперь нужно искать альтернативы. В этой статье мы кратко рассмотрим, что такое плагин Kotlin Android Extension, какие были проблемы с ним и что теперь нам, Android-разработчикам делать. Частично, использовался материал этой статьи. Итак, поехали.

Кратко о Kotlin Android Extensions

Kotlin Android Extensions — это плагин для Kotlin, позволяющий восстанавливать view из Activities, Fragments, и Views без написания стандартного бойлерплэйт-кода типа findViewById.
Плагин генерирует дополнительный код, который позволяет получить доступ к view в виде XML, так же, как если бы вы имели дело с properties с именем id, который вы использовали при определении структуры.

Также он создаёт локальный кэш view. При первом использовании свойства, плагин выполнит стандартный findViewById. В последующем, view будет восстановлен из кэша, поэтому доступ к нему будет быстрее.

Если это всё так удобно, то зачем его сделали deprecated?

Проблемы Kotlin Android Extensions

  • Используется глобальный нэйминг идентификаторов. Могут возникнуть ситуации, когда один и тот же идентификатор имеется у разных view в разных лэйаутах — соответственно только на этапе работы приложения вы узнаете о том, что использовали не тот id.
  • Возможно использовать только в проектах на Kotlin (кэп)
  • Отсутствует Null Safety. В случае, когда view представлена в одной конфигурации и отсутствует в другой — может возникнуть краш, т.к отсутствует обработка таких ситуаций
  • Невозможно использовать в многомодульных проектах. Очень распространённый сценарий: у вас есть модуль UI Kit, хранящий общие UI-компоненты, которые вы хотите переиспользовать в других модулях. До сих пор висит issues которое вряд ли поправят. В таком сценарии обычно используют старый добрый findViewById :(
  • Резюмируя приведённые недостатки, нетрудно понять, что этот подход не идеален — хотя, безусловно, очень удобен на небольших проектах. На больших проектах с многомодульной архитектурой и сотнями экранов — использование Kotlin Android Extensions уже не кажется идеальным решением.

Альтернативные способы

  • Использование KotterKnife (кек, даже не думайте).
  • Старый добрый FindViewById() — уже получше, но так себе.
  • Использование AndroidAnnotations (привет из 2015)
  • View Binding от Google — бинго!

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:

android < . buildFeatures < viewBinding true >>

После этого можно уже использовать. Каждый сгенерированный binding класс содержит ссылку на корневой view разметки (root) и ссылки на все view, которые имеют id. Имя генерируемого класса формируется как «название файла разметки», переведенное в camel case + «Binding». Например, для файла разметки result_profile.xml:

Будет сгенерирован класс ResultProfileBinding, содержащий 2 поля: TextView name и Button button.

Использование в Activity

Например у вас вот такой layout:

Результат работы ViewBinding:

public final class ActivityMainBinding implements ViewBinding < @NonNull private final ConstraintLayout rootView; @NonNull public final TextView textView;

Использовать viewBinding можно так:

private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?)

И теперь, после того, как получили ссылки на view:

binding.name.text = viewModel.name binding.button.setOnClickListener

Если вы используете ViewBinding во фрагменте и держите ссылку на binding во фрагменте (а не только в методе onCreateView()) то не забывайте очищать ссылки в методе onDestroyView().

private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? < _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view >override fun onDestroyView()

Это необходимо делать из-за жизненного цикла фрагмента и view:

image

В целом, переключиться на ViewBinding достаточно не сложно, хотя и жаль, что Kotlin Android Extensions объявлен deprecated. Не забудьте присоединиться к нам в Telegram, а на платформе AndroidSchool.ru публикуются полезные материалы для Android-разработчика и современные туториалы.

  • Туториалы в телеграм
  • Документация по ViewBinding
  • Статья о жизненном цикле фрагмента и view
  • Статья о применении ViewBinding
  • android development
  • viewbinding
  • kotlin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *