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é?
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.
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));
}
}
En fait, il existe encore des tutoriels qui ajoutent un préfixe à l'annotation BindingAdapter
.
@BindingAdapter({"imageUrl"})
sans préfixe.<ImageView
imageUrl="@{url}"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
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.