web-dev-qa-db-fra.com

Android adaptateur de liaison passant plusieurs arguments provoque une erreur

Je suis assez nouveau dans Android Data Binding. Je suis ce tutoriel: Data Binding Library . J'essaie de faire un adaptateur qui reçoit plusieurs paramètres. Voici mon code:

[~ # ~] xml [~ # ~]

   <ImageView
            Android:layout_width="@dimen/place_holder_size"
            Android:layout_height="@dimen/place_holder_size"
            Android:layout_alignParentRight="true"
            Android:layout_alignParentTop="true"
            Android:layout_centerVertical="true"
            app:url="@{image.imageUrl}"
            app:size="@{@dimen/place_holder_size}"
            />

CLASSE ADAPTATEUR DE LIAISON

public class ViewBindingAdapters extends BaseObservable {

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, int size) {
    if (!Strings.isNullOrEmpty(url)) {
        Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
    }
}
....


}

Mais je reçois cette erreur:

Java.lang.RuntimeException: erreurs de liaison de données trouvées. ****/erreur de liaison de données **** msg: impossible de trouver le setter pour l'attribut 'app: url' avec le type de paramètre Java.lang.String sur Android.widget.ImageView. fichier: ... li_image_item.xml loc: 30: 27 - 30:40 ****\erreur de liaison de données ****

Est-ce que quelqu'un sait pourquoi?

Merci d'avance!

20
IrApp

Le problème est @dimen/place_holder_size, il renvoie float pendant que vous l'attrapez en tant que int

changez votre méthode BindingAdapter en ceci

@BindingAdapter({"bind:url", "bind:size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

vous pouvez vous référer ceci

32
Ravi Rupareliya

Ce que j'ai mal fait, c'est l'ordre des arguments dans la fonction. Vous pouvez ajouter plusieurs attributs dans l'adaptateur de liaison, mais ils doivent correspondre aux arguments avec la même séquence définie dans la méthode.

Voici mon extrait de code pour Kotlin

@BindingAdapter(value = ["bind:brand", "bind:model", "bind:age"], requireAll = false)
@JvmStatic
fun bindProductDetails(linearLayout: LinearLayout, brand: String?, model: String?, age: String?) {
    if (brand != null && !brand.isEmpty()) {
        //code
        //code

    }
}
9
KishanSolanki124

essaye ça

 @BindingAdapter(value={"url", "size"}, requireAll=false)
 public static void loadImage(ImageView imageView, String url, int size) {
        if (!Strings.isNullOrEmpty(url)) {
            Picasso.with(imageView.getContext()).load(url).resize(size, size).centerCrop().into(imageView);
        }
    }
4
Nas

Mise à jour

Vous n'avez pas besoin de créer de préfixe bind:, utilisez-le.

@BindingAdapter({"url", "size"})
public static void loadImage(ImageView imageView, String url, float size) {

}

En XML, utilisez n'importe quel préfixe comme app:

app:url="@{image.imageUrl}"
2
Khemraj