Популярно, доступно, полезно

Android DataBinding для начинающих


Предисловие

Android Data Binding(привязка данных) — один из лучших способов значительно облегчить жизнь разработчику, уменьшив объем кода. Прошло довольно много времени с Google I/O 2015, когда впервые появилась привязка данных. На Google I/O 2016 была анонсирована вторая версия, которая стала еще более мощной, чем раньше. Давайте посмотрим, как это работает.

Изменения в Gradle

Нет необходимости добавлять какую-либо библиотеку для использования android databinding, достаточно просто добавить в тег dataBinding enabled=true внутри тега Android.

Включение dataBinding

Изменения в XML-макете

Самое простое изменение в макете — это добавление тега layout на верхний уровень иерархии представлений.

Тэг layout наверху

Итак, простое добавление layout в верх может сделать свое дело

Почему я должен добавить layout наверх?
Когда вы определяете тег layout, он сообщает компилятору, что в этом макете используется android databinding, поэтому необходим новый отдельный класс для ее обработки. Имя созданного класса точно будет совпадать с именем вашего xml в верблюжей нотации(camel case) с добавлением в конце Binding. Так что, если имя файла — Activity_main, то будет сгенерирован класс с именем ActivityMainBinding.

Преимущества добавления тега layout

Существует много библиотек, которые просто позволяют избежать вызова findViewById(). Одной из самых распространенных является ButterKnife. Теперь, когда вы добавили data binding, вам не нужно findViewById(). Генерируется отдельный класс с тем же именем, что и у xml-файла с помощью добавления Binding, который выполняет свою задачу.

Как избежать использования findViewById()

Внутри вашего метода onCreate инициализируйте объект привязки данных с помощью DataBindingUtil, вместо прямого доступа к представлениям.

DataBaindingUtil

После использования android databinding:

После android databinding

Как это помогает избежать вызова findViewById():
Теперь, если у вас есть textview с идентификатором tv_name, все что нужно сделать в активности, это просто вызвать mainBinding.tvName.

Как привязка может уменьшить объем кода?

Теперь подумайте о ситуации, когда у вас есть несколько EditText, и вы должны динамически установить им значения, но не прямым изменением, а добавив TextWatcher к каждому. Традиционный метод потребует написание большого количества кода, но с android databinding нужно просто создать класс модели с полями типа ObservableField и сделать его public.

ObservableField

Почему ObservableField?
Он устанавливает слушателя за полем, который непрерывно отслеживает любые изменения данных поля. Не стоит применять этот подход, если у вас длинный список полей. Лучше остановиться на традиционном способе отслеживания изменений(обновление данных с помощью метода invalidateAll).

Не нужны getter’ы и setter’ы?
ObservableField имеет метод set и get. Таким образом, нет необходимости использовать getter’ы и setter’ы. Вы можете включать конструкции name.set(«Джек») и name.get() для получения значения.

Теперь, чтобы эта модель работала, есть два места, где нужно внести изменения: .xml и .java файл.

.xml:

Добавьте специальный тег с именем data внутрь тега layout, а в data используйте variable тег для объявления переменной модели.

<data>
    <variable
        name="registration"
        type="com.example.android.RegistrationModel"/>
</data>

Теперь установите значения представлениям в xml, используя имя объекта, в данном случае это registration.

Установка значений в xml

Почему используется String.valueOf()?
Помните, что класс модели имеет тип данных поля age как Integer, а setText в textview принимает тип String. Поэтому важно использовать String.valueOf(), если тип данных не String.

Что тернарный оператор (?:) делает в xml
Привязка поддерживает множество выражений, и одним из них является тернарный оператор

Что если нужен слушатель для получения значений из представления?

Замените @ {} на @ = {}.
Когда пользователь будет вводить данные, то они установятся обратно в объект модели. Если нужно получить значения, просто вызовите этот объект.

Text watcher

.java file:

Единственное необходимое изменение — это установка переменной. Переменная, объявленная в xml, будет инициализирована в том объекте, который вы передадите в activity.java.

Xml initialized

Откуда берется setRegistration?
Имя класса модели — Registration, поэтому ActivityMainBinding создал setRegistration. Если имя класса модели было бы User, то у вас будет метод setUser.

Чтобы устанавливать значения в объект модели, используйте конструктор или setter’ы .

С помощью конструктора:

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

Когда вы создаете объект модели, передайте в нее значение и оно будет автоматически установлено в представлении.

С помощью setter’а:

С помощью setter'а

После использования setter’а значение автоматически отражается в пользовательском интерфейсе.

Стоит ли чего-то использование DataBinding?

Да, если вы не используете android databinding, но по-прежнему добавляете тег layout(т.к. он создает отдельный класс). Если вы не используете привязку, не пишите layout в XML.

Что если мой товарищ по команде не использует привязку данных?

Нет проблем. Если вы хотите использовать android databinding, то нет необходимости менять все существующие классы. В каком бы из них вы не хотели применить привязку данных, просто измените его и оставьте остальные без изменений.

Перевод статьи «Data Binding for beginners!»

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

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