Подтвердить что ты не робот

Как установить ресурс Image в ImageView с помощью DataBinding

Как мы можем использовать привязку данных в android для размещения ресурса изображения в 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" />

Я хочу, чтобы изображение было ожидающим, а другое изображение, если ожидающим является false. Но он показывает ошибку. Как я могу достичь этой функциональности?

4b9b3361

Ответ 1

установить изображение, как это,

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

Ответ 2

Ответ:

определить:

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

использовать:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:scaleType="center"
    android:src="@{viewModel.imageRes, [email protected]/guide_1}"/>

Ответ 3

Я пробовал это, и он работает для меня (buildToolsVersion: 24.0.1):

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

просто используйте app:imageResource для замены android:src, android:src="@{item.avatarResId}" не работает, иначе определите для него пользовательский @BindAdapter("android:src").

но использовать app:imageResource не нужно дополнительно определять @BindAdapter, потому что ImageView имеет метод под названием setImageResource(), когда вы используете app:imageResource, он будет автоматически вызывать setImageResource().

Ответ 4

Если вы хотите передать аргумент в метод, такой как @IdRes вы можете использовать

XML

<?xml version="1.0" encoding="utf-8"?>
<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
}

Ответ 5

Вы можете сделать это, не делая ничего программно, если ваша модель данных содержит идентификатор ресурса изображения.

Пример:

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

Просто добавьте следующую строку в свой imageView (я не смог отформатировать код, когда добавлял его там):

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

где resId содержит R.drawable.your_image_name

Ответ 6

Согласно этой замечательной статье: Загрузка изображений с помощью Data Binding и Picasso

Есть два способа сделать это:

  1. Использование @BindingAdapter
  2. ObservableField & custom Picasso Target

В Справочнике по привязке данных для разработчиков Android вы найдете только первое.

Пожалуйста, прочитайте обе статьи.

Больше информации:

Надеюсь, это поможет.

Ответ 7

Подробнее см. здесь Подробности Загрузка изображений с привязкой данных и 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);
    }
}
}

Ответ 8

Возможно, вы прочитали здесь и помните, что старые системы не могут его обработать

Ответ 9

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

затем

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

Ответ 10

Проблема заключается в том, что все атрибуты, которые имеют значение, имеют сеттеры с одинаковым именем. например android: x не работает, если метод setX() не существует в этом представлении аналогично, если бы у нас был метод setSrc() в ImageView, ваш код работал бы без адаптера привязки

Ответ 11

Магия возникает, когда мы создаем пользовательскую цель Picasso, которая берет ObservableField и обрабатывает ее значение. Проверьте полную информацию здесь. http://mobologicplus.com/load-image-url-imageview-using-data-binding-picasso-kotlin/

public class ProfileViewModel(context: Context, imageUrl : String) {

    var IMAGE_URL: String? = null
    var profileImage: ObservableField<Drawable>? = null
    private var bindableFieldTarget: BindableFieldTarget? = null

    init {
        this.IMAGE_URL = imageUrl
        profileImage = ObservableField<Drawable>()
        // Picasso keeps a weak reference to the target so it needs to be stored in a field
        bindableFieldTarget = BindableFieldTarget(profileImage!!, context.getResources())
        Picasso.with(context)
                .load(IMAGE_URL)
                .placeholder(R.drawable.user)
                .into(bindableFieldTarget);
    }

    class BindableFieldTarget(private val observableField: ObservableField<Drawable>, private val resources: Resources) : Target {

        override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
            observableField.set(BitmapDrawable(resources, bitmap))
        }

        override fun onBitmapFailed(errorDrawable: Drawable) {
            observableField.set(errorDrawable)
        }

        override fun onPrepareLoad(placeHolderDrawable: Drawable) {
            observableField.set(placeHolderDrawable)
        }
    }
}

И мы должны установить этот imageUrl для этой цели в нашем классе адаптера или в том, что вы используете.

val profileViewModel = ProfileViewModel(MainApplication.applicationContext(), items[position].user.profileImageUrl)
    holder.view.vm.imageUrl.set(profileViewModel.profileImage!!.get())