Cómo establecer recurso de imagen a ImageView utilizando DataBinding

¿Cómo podemos utilizar el enlace de datos en android para poner recursos de imagen en 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" /> 

Quiero una imagen si pendiente es verdadera y otra imagen si pendiente es falsa. Pero está mostrando error.Cómo puedo lograr esta funcionalidad?

8 Solutions collect form web for “Cómo establecer recurso de imagen a ImageView utilizando DataBinding”

Fije la imagen como esto,

  <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" /> 

La respuesta: https://stackoverflow.com/a/36941125/703225

definir:

 @BindingAdapter({"android:src"}) public static void setImageViewResource(ImageView imageView, int resource) { imageView.setImageResource(resource); } 

utilizar:

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

He intentado esto, y funciona para mí (buildToolsVersion: 24.0.1):

 <ImageView android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="8dp" android:scaleType="centerInside" app:imageResource="@{item.avatarResId}"/> 

Basta con usar app:imageResource para reemplazar android:src , android:src="@{item.avatarResId}" no funciona más define un @BindAdapter("android:src") personalizado @BindAdapter("android:src") para ello.

Pero usa app:imageResource no necesita definir un @BindAdapter adicionalmente, porque el ImageView tiene un método llamado setImageResource() , cuando usas app:imageResource , llamará setImageResource() automáticamente.

Accorrding a este gran artículo: Loading images with Data Binding y Picasso

Hay dos maneras de hacerlo:

  1. Utilizando @BindingAdapter
  2. ObservableField y personalizado Picasso Target

En la Guía de referencia de datos de Android Developers, encontraría sólo la primera.

Por favor, lea ambos artículos.

Más información:

Espero que ayude.

Más detalles Consulte aquí Detalles Carga de imágenes con enlace de datos y Picasso

 public class ProfileViewModel { // The URL will usually come from a model (ie 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); } } } 

Tal vez lea aquí y recuerde que los sistemas antiguos no pueden manejarlo

 <ImageView ... app:svg="@{@drawable/ic_car_placeholder}" /> 

entonces

 @BindingAdapter({"app:svg"}) public static void setImageViewResource(ImageView imageView, Drawable resource) { imageView.setBackgroundDrawable(resource); } 

El problema es que con todos los atributos que tienen setters con el mismo nombre. Por ejemplo android: x no funcionará si el método setX () no está allí en esa vista también si tuviéramos el método setSrc () en ImageView tu código habría funcionado sin adaptador de enlace personalizado

  • Android: ¿Cómo inyectar un elemento <string> en otro elemento <string> en XML?
  • Cómo crear archivos estáticos (sólo con archivos xml) ExpandableListView en Android
  • Adjuntar TextView a RecyclerView
  • Android TextView DrawableTint en dispositivos pre v23
  • Crear Circular y Transparente Drawable XML Android
  • Permisos de geolocalización insuficientes
  • ActionLayout para los elementos de la vista de navegación se muestra en el lado derecho
  • Se muestra Google Maps Android sólo pantalla en blanco
  • Android support-v7 CardView: La vista de texto de encabezado con otro color de fondo no se extiende hasta que los bordes
  • El efecto Ripple no va por encima de ImageView
  • Uso de atributos desde el nivel API más allá de minSdkVersion
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.