. . .
Как вы знаете, Data Binding Library - это отличная часть библиотеки Android Jetpack, позволяющая сократить количество шаблонного кода и связать представления с данными более эффективным способом, чем это было возможно ранее. В этой статье я собираюсь объяснить, как можно использовать привязку данных в наших пользовательских представлениях.
. . .
Начало работы
Чаще всего мы создаем пользовательские представления для повышения производительности, настройки и т.д., но если вы используете привязку данных в своих проектах, или напротив не используете ее в своих пользовательских представлениях, это не очень хорошо. Возможно, это выглядит примерно так:
class MyCustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { init { attrs?.let { val typedArray = context.obtainStyledAttributes(it, R.styleable.MyCustomView) // some attr handling stuffs... typedArray.recycle() } }}
Но если вы хотите использовать пользовательское представление с компонентом привязки данных, то нет необходимости обрабатывать эти атрибуты.
Автоматический выбор метода
Когда вы определяете атрибут следующим образом:
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="MyCustomView"> <attr name="currencyCode" format="string" /> </declare-styleable></resources>
библиотека привязки данных имеет возможность автоматического
выбора метода, то есть для атрибута с именем
currencyCode
библиотека автоматически пытается найти
метод setCurrencyCode(arg)
, принимающий в качестве
аргумента совместимые типы. Пространство имен атрибута не
учитывается, при поиске метода используется только имя атрибута и
тип. С другой стороны, если автоматический выбор метода не работает
для имени вашего атрибута или вы хотите изменить метод сеттера для
вашего атрибута, вы можете использовать методы привязки.
Методы привязки
Методы привязки дают вам возможность изменить сеттер для
атрибута вашего пользовательского представления. Вы можете
поместить эти методы над своим классом, используя аннотацию
@BindingMethods
, или создать пустой класс с этой
аннотацией.
class MyCustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { private val currencyFormatter = NumberFormat.getCurrencyInstance(Locale.getDefault()) //.. fun setCurrency(currencyCode: String?) { if (currencyCode.isNullOrEmpty()) return currencyFormatter.currency = Currency.getInstance(currencyCode) } //..}
определите функцию, названную как угодно, затем просто поместите ее с атрибутом в методы привязки.
@BindingMethods( value = [ BindingMethod( type = MyCustomView::class, attribute = "currencyCode", method = "setCurrency" ) ])class BindingMethods
с помощью этого способа вы можете задать различные имена сеттеров для вашего атрибута.
Адаптеры привязки
Если у вас есть функции с несколькими параметрами в вашем пользовательском представлении, и необходимо использовать эти функции с привязкой данных, то в этом случае следует использовать адаптеры привязки.
@BindingAdapter( value = ["paddingEnd", "paddingTop", "paddingStart", "paddingBottom"], requireAll = false)fun MyCustomView.setPaddingRelative( paddingEnd: Int = 0, paddingTop: Int = 0, paddingStart: Int = 0, paddingBottom: Int = 0) { this.setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom)}
Для настройки отступов можно создать адаптер привязки, как показано в примере.
. . .
Вот и все, спасибо за чтение! Если вам понравилась эта история, пожалуйста, нажмите на стрелочку вверх и поделитесь ею, чтобы помочь другим!
Если у вас есть какие-либо комментарии, не стесняйтесь связаться со мной в Twitter.
Перевод материала подготовлен в рамках запуска курса "Android Developer. Professional".
Всех желающих приглашаем на двухдневный интенсив по теме: "Полный coverage. Покрываем Android приложение юнит/интеграционными/UI тестами"