Почему я могу свободно называть функцию для адаптеров привязки?
Поскольку имя функции не имеет значения. Привязка данных работает путем автоматической генерации кода на основе аннотаций, которые вы используете в своих методах, и «кода» привязки данных, который вы используете в XML.
Итак, допустим, вы аннотируете метод, который принимает View
и установите атрибут в XML:
@BindingAdapter("app:hideIfZero")
fun hideIfZero(view: View, number: Int) {
view.visibility = if (number == 0) View.GONE else View.VISIBLE
}
...
app:hideIfZero="@{viewmodel.likes}"
Процессор аннотации привязки данных читает это , когда вы компилируете свой код , и генерирует код привязки, который выглядит примерно так (вы можете искать Android Студия для вашего класса привязки, чтобы увидеть, как именно он выглядит, но идея должна сохраняться):
class MyBinding {
// Public setter for the view model variable in the XML
public void setViewModel(viewModel: MyVieModel) {
// Here will be a series of calls to set the values on views based on
// the XML declarations and BindingAdapter annotations.
// Here "hideIfZero" annotation is set on "hideIfZero" method, so code
// to call that method with the view and value set in XML is generated
hideIfZero(this.progressBar, viewModel.likes)
}
}
Если вы измените имя метода, при компиляции кода процессор сгенерирует код в соответствии с новым методом, для которого установлена аннотация:
@BindingAdapter("app:hideIfZero")
fun hideIfZeroNewName(view: View, number: Int) {
view.visibility = if (number == 0) View.GONE else View.VISIBLE
}
class MyBinding {
// Public setter for the view model variable in the XML
public void setViewModel(viewModel: MyVieModel) {
// Here will be a series of calls to set the values on views based on
// the XML declarations and BindingAdapter annotations.
// Here "hideIfZero" annotation is set on "hideIfZeroNewName" method,
// so code to call that method with the view and value set in XML
// is generated
hideIfZeroNewName(this.progressBar, viewModel.likes)
}
}
Надеюсь, это поможет!