Почему я могу назвать функцию для привязки адаптеров свободно? - PullRequest
0 голосов
/ 21 февраля 2020

Я учусь 'Использование связующих адаптеров для создания пользовательских атрибутов'

Код A + Код B работает хорошо.

Если я заменю имя функции hideIfZero на hideIfZeroNewName точно так же, как код C, я найду Код C + Код B также работает хорошо почему?

код A

@BindingAdapter("app:hideIfZero")
fun hideIfZero(view: View, number: Int) {
    view.visibility = if (number == 0) View.GONE else View.VISIBLE
}

код B

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="0dp"
            android:layout_height="wrap_content"           
            app:hideIfZero="@{viewmodel.likes}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@+id/like_button"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="@+id/like_button"
            app:layout_constraintTop_toBottomOf="@+id/like_button"
            app:progressScaled="@{viewmodel.likes}"
            tools:progressBackgroundTint="@android:color/darker_gray"/>

код C

@BindingAdapter("app:hideIfZero")
fun hideIfZeroNewName(view: View, number: Int) {
    view.visibility = if (number == 0) View.GONE else View.VISIBLE
}

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Поскольку привязка не имеет значения для имени функции, см. В учебных примерах setText и setBackground, не совпадающие с именем привязки.

1 голос
/ 01 марта 2020

Почему я могу свободно называть функцию для адаптеров привязки?

Поскольку имя функции не имеет значения. Привязка данных работает путем автоматической генерации кода на основе аннотаций, которые вы используете в своих методах, и «кода» привязки данных, который вы используете в 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)
    }
}

Надеюсь, это поможет!

...