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é?

31
demandé sur George Thomas 2016-01-05 11:19:22

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" />
24
répondu luttu android 2016-06-01 13:27:48

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}"/>
35
répondu qinmiao 2018-05-02 14:15:07

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.

16
répondu Spark.Bao 2017-01-13 04:08:25

selon ce grand article: Chargement d'images avec liaison de données et Picasso

il y a deux façons de le faire:

  1. utilisant @BindingAdapter
  2. 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:

Espère que ça aide.

5
répondu piotrek1543 2016-01-05 08:46:19

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
}
4
répondu yoAlex5 2017-08-28 15:47:03

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);
    }
}
}
2
répondu sasikumar 2016-01-05 08:44:02

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)}"

resId contient R.drawable.your_image_name

1
répondu Rohan Taneja 2017-11-29 17:09:33
<ImageView ...
        app:svg="@{@drawable/ic_car_placeholder}" />

puis

@BindingAdapter({"app:svg"})
public static void setImageViewResource(ImageView imageView, Drawable resource) {
    imageView.setBackgroundDrawable(resource);
}
0
répondu user1269737 2017-05-26 18:06:05

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é

0
répondu Amit Kaushik 2017-06-19 20:00:55