web-dev-qa-db-ja.com

DataBindingを使用してImageViewにImageリソースを設定する方法

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

保留中がtrueの場合は画像が、保留中がfalseの場合は別の画像が必要です。しかし、エラーが表示されています。この機能を実現するにはどうすればよいですか?

48
George Thomas

このように画像を設定し、

  <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" />
34
luttu android

answer

定義する:

@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}"/>
43
qinmiao

私はこれを試してみました、それは私のために働きます(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")を定義します。

imageViewにはsetImageResource()というメソッドがあるため、app:imageResourceを使用する場合、@BindAdapterを追加で定義する必要はありません。app:imageResourceを使用すると、setImageResource()自動的に。

31
Spark.Bao

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

データモデルにイメージのリソース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が含まれます

6
Rohan Taneja

このすばらしい記事によると: データバインディングとピカソを使用した画像の読み込み

それを行うには2つの方法があります。

  1. @BindingAdapterを使用
  2. ObservableFieldおよびカスタムPicassoターゲット

Android Developers reference Data Binding Guide では、最初のもののみが見つかります。

両方の記事を読んでください。

詳細情報:

お役に立てば幸いです。

4
piotrek1543

詳細はこちらを参照 Detailsデータバインディングと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);
    }
}
}
1
sasikumar

問題は、同じ名前のセッターを持つすべての属性にあります。例えばAndroid:xは、setX()メソッドがそのビューにない場合、同様にImageViewにsetSrc()メソッドがあった場合は機能しません。カスタムバインディングアダプターなしでコードは機能します

0
Amit Kaushik