84

Android でデータ バインディングを使用して、画像リソースを .xml ファイルに配置するにはどうすればよい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 の場合は別の画像が必要です。しかし、エラーが表示されます。この機能を実現するにはどうすればよいですか?

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:srcで、android:src="@{item.avatarResId}"機能しません。それ以外の場合は、カスタム@BindAdapter("android:src")を定義します。

ただし、ImageView には というメソッドがあり、 を使用すると自動的に呼び出されるため、追加でapp:imageResource定義する必要はありません。@BindAdaptersetImageResource()app:imageResourcesetImageResource()

于 2017-01-12T10:54:08.353 に答える
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 に答える
5

この素晴らしい記事によると: Loading images with Data Binding and Picasso

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

  1. 使用する@BindingAdapter
  2. ObservableField& カスタム ピカソ ターゲット

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

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

詳細情報:

それが役立つことを願っています。

于 2016-01-05T08:46:19.993 に答える
1

詳細はこちらを参照詳細 データバインディングと 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);
    }
}
}
于 2016-01-05T08:44:02.583 に答える
-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 に答える