Расширяем функционал include с помощью DataBinding

Убираем дублирование элементов в layout куда круче чем раньше

sashatinkoff
О разработке для Android
2 min readMay 29, 2020

--

Привет.

Поднимите руки те, кто использует (или использовал) конструкцию include layout в шаблоне? Опустите, и продолжайте читать дальше. Давайте только сначала пройдемся по документации и освежим в памяти что это за переиспользование лейаутов. https://developer.android.com/training/improving-layouts/reusing-layouts

Краткий экскурс в прошлое — в основном я использовал эту схему для отображения однотипных прогрессбаров — в списках, при загрузке контента и проч. Это самое тривиальное использование. Более частный случай, например, создание форм для ввода данных, где кучу конструкций TextInputLayout — AppCompatEditText можно сократить просто на более понятные при чтении инклуды (впрочем, проблемным моментом было например использование различных подсказок hint для конкретного поля)

С вводом в обиход библиотеки Data Binding Library возникла мысль о более гибкой кастомизации, и вот к чему меня это привело.

Допустим, задача следующая — использовать различные сообщения для индикаторов загрузки на разных экранах (например, “Загрузка данных пользователя”, или “Пожалуйста подождите, идет загрузка контента”). Если с формальным отображением в стиле ProgressBar / TextView все вроде бы просто, то для проброски текста сообщения приходилось мусорить в Kotlin коде.

DataBinding позволяет нам пробрасывать данные непосредственно в layout файле, в теге include. Выглядит это к примеру, вот так

Нюанс первый

Для того, чтобы можно было пробрасывать имя переменной, необходимо начинать строку с символа @, иначе компилятор сругается при сборке.

Нюанс второй

Необходимо изменить файл layouts/progress.xml, добавить в него переменную name и отображать ее значение в TextView

Нюанс третий

(который можно еще назвать “Я все сделал, но у меня ничего не работает”)

Во-первых, нужно подключить DataBinding Library в проект. Делается это довольно легко — нужно просто в app/build.gradle (ну или как у вас модуль называется?) прописать следующую строку в элементе Android:

buildFeatures {
dataBinding = true
}

До недавних пор подключение библиотеки прописывалось немного иначе, так что если у вас не самая последняя Android Studio, то возможно это будет выглядеть вот так

dataBinding {
enabled = true
}

Подключать рутовый layout необходимо не через setContentView (или какой-нибудь LayoutInflate.inflate) а с помощью DataBindingUtil, например

В данном примере PageSquareOffsBinding extends ViewDataBinding

Вот и вся недолга.

P.S. А вот пример переиспользования виджета Toolbar на разных экранах, где он выглядит везде одинаково, но отличается лишь в маленьких нюансах

--

--

sashatinkoff
О разработке для Android

Пишу о разном с матом ем булку с маком никогда не бегал с автоматом