Comment définir la ressource D'Image à ImageView en utilisant DataBinding [dupliquer]
cette question a déjà une réponse ici:
- Set drawable ID de ressource dans android:src pour ImageView à l'aide de la liaison de données dans Android 6 réponses
Comment Pouvons-nous utiliser la liaison de données dans android pour mettre la ressource d'image dans un ImageView
?
<ImageView
android:id="@+id/is_synced"
android:src="@{model.pending ? @mipmap/pending: @mipmap/synced}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Je veux une image si l'attente est vrai et une autre image si l'attente est faux. Mais il montre l'erreur.Comment puis-je obtenir cette fonctionnalité?
9 réponses
définir l'image comme ceci,
<ImageView
android:layout_width="28dp"
android:layout_height="28dp"
android:src="@{model.isActive ? @drawable/white_activated_icon :@drawable/activated_icon}"
tools:src="@mipmap/white_activated_icon" />
Le réponse :
define:
@BindingAdapter({"android:src"})
public static void setImageViewResource(ImageView imageView, int resource) {
imageView.setImageResource(resource);
}
utiliser:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="center"
android:src="@{viewModel.imageRes, default=@drawable/guide_1}"/>
j'ai essayé, et cela fonctionne pour moi (buildToolsVersion: 24.0.1):
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="8dp"
android:scaleType="centerInside"
app:imageResource="@{item.avatarResId}"/>
il suffit d'utiliser app:imageResource
pour remplacer android:src
, android:src="@{item.avatarResId}"
ne fonctionne pas autrement définir une coutume @BindAdapter("android:src")
pour elle.
mais utilisez app:imageResource
n'a pas besoin de définir un @BindAdapter
en outre, parce que L'ImageView a une méthode appelée setImageResource()
, lorsque vous utilisez app:imageResource
, il appellera setImageResource()
automatiquement.
selon ce grand article: Chargement d'images avec liaison de données et Picasso
il y a deux façons de le faire:
- utilisant
@BindingAdapter
-
ObservableField
& custom Picasso Target
dans Android Developers reference Data Binding Guide , vous ne trouverez que le premier.
s'il vous plaît lire les deux articles.
plus d'informations:
- http://www.mutualmobile.com/posts/using-data-binding-api-in-recyclerview
- https://blog.stylingandroid.com/data-binding-part-3 /
Espère que ça aide.
Si vous souhaitez passer un argument dans la méthode comme un @Idrefs vous pouvez utiliser
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="<package name>.R" />
</data>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:load_image="@{R.drawable.image}" />
</layout>
@BindingAdapter("load_image")
public static void loadImage(ImageView view, @IdRes int imageId) {
//Logic
}
Voir plus de détails ici détails Chargement d'images avec liaison de données et Picasso
public class ProfileViewModel {
// The URL will usually come from a model (i.e Profile)
static final String IMAGE_URL = "http://cdn.meme.am/instances/60677654.jpg";
public ObservableField<Drawable> profileImage;
private BindableFieldTarget bindableFieldTarget;
public ProfileViewModel(Context context) {
profileImage = new ObservableField<>();
// Picasso keeps a weak reference to the target so it needs to be stored in a field
bindableFieldTarget = new BindableFieldTarget(profileImage, context.getResources());
Picasso.with(context)
.load(IMAGE_URL)
.placeholder(R.drawable.placeholder)
.into(bindableFieldTarget);
}
public class BindableFieldTarget implements Target {
private ObservableField<Drawable> observableField;
private Resources resources;
public BindableFieldTarget(ObservableField<Drawable> observableField, Resources resources) {
this.observableField = observableField;
this.resources = resources;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
observableField.set(new BitmapDrawable(resources, bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
observableField.set(errorDrawable);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
observableField.set(placeHolderDrawable);
}
}
}
vous pouvez le faire sans rien faire de programmatique si votre modèle de données contient l'ID de Ressource de l'image.
exemple:
<layout>
<data>
<import type="android.support.v4.content.ContextCompat" />
<variable
name="roomInfoItem"
type="com.example......model.RoomInfoModel" /> </data>
<RelativeLayout>
<ImageView
android:id="@+id/iv_room_info_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
</layout>
ajoutez simplement la ligne suivante à votre imageView (Je n'ai pas pu formater le code lorsque je l'ai ajouté):
android:src="@{ContextCompat.getDrawable(context,roomInfoItem.resId)}"
où resId
contient R.drawable.your_image_name
<ImageView ...
app:svg="@{@drawable/ic_car_placeholder}" />
puis
@BindingAdapter({"app:svg"})
public static void setImageViewResource(ImageView imageView, Drawable resource) {
imageView.setBackgroundDrawable(resource);
}
Le problème, avec tous les attributs qui n'ont setters même nom. par exemple, android:x ne fonctionnera pas si la méthode setX() n'est pas présente dans cette vue. de même, si nous avions la méthode setSrc() sur ImageView, votre code aurait fonctionné sans adaptateur de liaison personnalisé