84

我们如何在 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" />

如果待处理为真,我想要一张图像,如果待处理为假,我想要一张图像。但它显示错误。我怎样才能实现这个功能?

4

9 回答 9

85

我试过这个,它对我有用(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:srcandroid:src="@{item.avatarResId}"不起作用,否则@BindAdapter("android:src")为它定义一个自定义。

但是使用app:imageResource不需要@BindAdapter额外定义a,因为ImageView有一个方法叫做setImageResource(),当你使用时app:imageResource,它会setImageResource()自动调用。

于 2017-01-12T10:54:08.353 回答
69

答案:_

定义:

@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, default=@drawable/guide_1}"/>
于 2016-06-07T09:27:33.593 回答
57

像这样设置图像,

  <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" />
于 2016-06-01T13:27:48.607 回答
15

如果您想将参数传递给@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
}
于 2017-08-28T09:50:08.233 回答
13

如果您的数据模型包含图像的资源 ID,则无需以编程方式执行任何操作即可执行此操作。

例子:

<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

于 2017-08-28T08:52:19.947 回答
5

根据这篇很棒的文章:使用数据绑定和毕加索加载图像

有两种方法可以做到:

  1. 使用@BindingAdapter
  2. ObservableField& 自定义毕加索目标

在 Android Developers reference Data Binding Guide中,您只会找到第一个。

请阅读这两篇文章。

更多信息:

希望它有所帮助。

于 2016-01-05T08:46:19.993 回答
1

更多详细信息请参阅此处详细信息 使用数据绑定和毕加索加载图像

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);
    }
}
}
于 2016-01-05T08:44:02.583 回答
0

问题在于所有具有相同名称的设置器的属性。例如,如果 setX() 方法不在该视图中,则 android:x 将无法工作,同样如果我们在 ImageView 上有 setSrc() 方法,您的代码将在没有自定义绑定适配器的情况下工作

于 2017-06-19T20:00:55.257 回答
-1
<ImageView ...
        app:svg="@{@drawable/ic_car_placeholder}" />

然后

@BindingAdapter({"app:svg"})
public static void setImageViewResource(ImageView imageView, Drawable resource) {
    imageView.setBackgroundDrawable(resource);
}
于 2017-05-26T18:06:05.250 回答