El Código A y el Código B son del proyecto https://github.com/android/databinding-samples.

El Código B muestra un icono basado en fun popularityIcon(view: ImageView, popularity: Popularity) y funciona bien.

Creo que el proyecto todavía puede funcionar bien incluso si cambio el nombre de @BindingAdapter("app:popularityIcon") a @BindingAdapter("myok:popularityIcon"), al igual que el Código C, ¿por qué?

Código A

object BindingAdapters {    
    @BindingAdapter("app:popularityIcon")
    @JvmStatic fun popularityIcon(view: ImageView, popularity: Popularity) {
        val color = getAssociatedColor(popularity, view.context)
        ImageViewCompat.setImageTintList(view, ColorStateList.valueOf(color))
        view.setImageDrawable(getDrawablePopularity(popularity, view.context))
    }
    ...
}

Código B

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="24dp"
    android:layout_marginTop="24dp"
    android:contentDescription="@string/profile_avatar_cd"
    android:minHeight="48dp"
    android:minWidth="48dp"
    app:layout_constraintBottom_toTopOf="@+id/likes_label"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0"
    app:layout_constraintVertical_chainStyle="packed"
    app:popularityIcon="@{viewmodel.popularity}"/>

Código C

object BindingAdapters {    
    @BindingAdapter("myok:popularityIcon")
    @JvmStatic fun popularityIcon(view: ImageView, popularity: Popularity) {
        val color = getAssociatedColor(popularity, view.context)
        ImageViewCompat.setImageTintList(view, ColorStateList.valueOf(color))
        view.setImageDrawable(getDrawablePopularity(popularity, view.context))
    }
    ...
}
0
HelloCW 24 jun. 2020 a las 15:12

2 respuestas

La mejor respuesta

El enlace de datos ignora los espacios de nombres. Por lo tanto, elimina app: o myok: o cualquier otra cosa. Además, si coloca ambos adaptadores con el mismo nombre pero con espacios de nombres diferentes, recibirá un error que le indica que hay más de un adaptador para popularityIcon. Puede consultar los documentos para obtener más información.

Nota: La Biblioteca de enlace de datos ignora los espacios de nombres personalizados con fines coincidentes.

1
Amin 3 jul. 2020 a las 23:23

Necesita actualizar su espacio de nombres en su XML si usa este enlace. como abajo

xmlns:myok="http://schemas.android.com/apk/res-auto"

Verifique el siguiente código

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myok="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
...
</androidx.constraintlayout.widget.ConstraintLayout>
0
Mehul Kabaria 24 jun. 2020 a las 12:30