Расширяем функционал include с помощью DataBinding
Убираем дублирование элементов в layout куда круче чем раньше
Привет.
Поднимите руки те, кто использует (или использовал) конструкцию 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 на разных экранах, где он выглядит везде одинаково, но отличается лишь в маленьких нюансах