web-dev-qa-db-fra.com

Avertissement relatif à l'adaptateur de liaison personnalisé Android DataBinding

J'ai suivi la documentation de liaison de données pour Custom Binding Adapter pour image loading depuis le site officiel des développeurs Android: http://developer.Android.com/tools/data-binding/guide. html

Une fois le code compilé avec succès, un message d'avertissement s'affiche:

Warning:Application namespace for attribute bind:imageUrl will be ignored.

Mon code est le suivant:

@BindingAdapter({"bind:imageUrl"})
    public static void loadImage(final ImageView imageView, String url) {
        imageView.setImageResource(R.drawable.ic_launcher);
        AppController.getUniversalImageLoaderInstance().displayImage(url, imageView);
    }

Pourquoi cet avertissement est généré?

Une capture d'écran est également jointe ...  enter image description here

41
asad.qazi

Je crois que l'espace de noms est vraiment ignoré dans l'annotation BindingAdapter. L'avertissement se produit si vous utilisez un préfixe d'espace de nom, qu'il corresponde ou non à celui utilisé dans votre présentation. Si vous omettez l'espace de noms, comme ceci:

@BindingAdapter({"imageUrl"})

... l'avertissement ne se produit pas.

Je soupçonne que l'avertissement existe pour nous avertir que l'espace de nom est supprimé avant que la chaîne ne soit utilisée comme clé dans l'implémentation de l'annotation. Ce qui est logique lorsque vous considérez que les mises en page sont libres de déclarer les espaces de noms qu'elles souhaitent, par exemple. app: ou bind: ou foo:, et l'annotation doit fonctionner dans tous ces cas.

77
Lorne Laliberte

Essayez ceci, travaillez pour moi! J'espère que cela pourra vous aider. Un moyen simple de changer la ressource image sans adaptateur de liaison.

<ImageButton
        ...
        Android:id="@+id/btnClick"
        Android:onClick="@{viewModel::onClickImageButton}"
        Android:src="@{viewModel.imageButton}" />

et Voir la classe de modèle:

public ObservableField<Drawable> imageButton;
private Context context;

//Constructor
public MainVM(Context context) {
    this.context = context;
    imageButton = new ObservableField<>();
    setImageButton(R.mipmap.image_default); //set image default
}

public void onClickImageButton(View view) {
    setImageButton(R.mipmap.image_change); //change image
}

private void setImageButton(@DrawableRes int resId){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        imageButton.set(context.getDrawable(resId));
    }else{
        imageButton.set(context.getResources().getDrawable(resId));
    }
}
1
icaksama

En fait, il existe encore des tutoriels qui ajoutent un préfixe à l'annotation BindingAdapter

Utilisez @BindingAdapter({"imageUrl"}) sans préfixe.

<ImageView
    imageUrl="@{url}"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />

Astuce Pro

Vous ne recevrez pas d'avertissement si vous utilisez le préfixe Android: dans BindingAdapter. Parce que cela est encouragé ... Je suggérerai d'utiliser @BindingAdapter("Android:src") au lieu de créer un nouvel attribut.

@BindingAdapter("Android:src")
public static void setImageDrawable(ImageView view, Drawable drawable) {
    view.setImageDrawable(drawable);
}

et 

@BindingAdapter("Android:src")
public static void setImageFromUrl(ImageView view, String url) {
   // load image by glide, piccaso, that you use.
}

Créez un nouvel attribut uniquement lorsque vous en avez besoin.

0
Khemraj