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の場合は別の画像が必要です。しかし、エラーが表示されています。この機能を実現するにはどうすればよいですか?
このように画像を設定し、
<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" />
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}"/>
私はこれを試してみました、それは私のために働きます(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()
自動的に。
@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
}
データモデルにイメージのリソース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
が含まれます
このすばらしい記事によると: データバインディングとピカソを使用した画像の読み込み
それを行うには2つの方法があります。
@BindingAdapter
を使用ObservableField
およびカスタムPicassoターゲットAndroid Developers reference Data Binding Guide では、最初のもののみが見つかります。
両方の記事を読んでください。
詳細情報:
お役に立てば幸いです。
詳細はこちらを参照 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);
}
}
}
問題は、同じ名前のセッターを持つすべての属性にあります。例えばAndroid:xは、setX()メソッドがそのビューにない場合、同様にImageViewにsetSrc()メソッドがあった場合は機能しません。カスタムバインディングアダプターなしでコードは機能します