visor una studio poner mostrar manipular imagenes imagen fondo desde como cargar añadir ajustar agregar android xml android-databinding

una - mostrar imagen en imageview android



Cómo establecer el recurso de imagen en ImageView usando DataBinding (10)

¿Cómo podemos utilizar el enlace de datos en Android para poner recursos de imágenes 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 está pendiente y otra imagen si está pendiente es falsa. Pero muestra un error. ¿Cómo puedo lograr esta funcionalidad?



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


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

simplemente use la app:imageResource para reemplazar a android:src , android:src="@{item.avatarResId}" no funciona, defina un @BindAdapter("android:src") personalizado @BindAdapter("android:src") para ello.

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


La answer :

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


Más detalles Consulte aquí Details Carga de imágenes con enlace de datos y 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); } } }


Puede hacerlo sin hacer nada programáticamente si su modelo de datos contiene el ID de recurso de la imagen.

Ejemplo:

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

Simplemente agregue la siguiente línea a su imageView (no pude formatear el código cuando lo estaba agregando allí):

android:src="@{ContextCompat.getDrawable(context,roomInfoItem.resId)}"

donde resId contiene R.drawable.your_image_name


Si desea pasar una discusión al método como @IdRes, puede usar

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


Tal vez su lectura here y recordar que los viejos sistemas no pueden manejarlo


establecer una imagen como esta,

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


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

entonces

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