So legen Sie die Bildressource mithilfe von DataBinding auf ImageView fest [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Georg Thomas

Wie können wir die Datenbindung in Android verwenden, um Bildressourcen in eine ImageView?

  <ImageView
            android:id="@+id/is_synced"
            android:src="https://stackoverflow.com/questions/34607028/@{model.pending ? @mipmap/pending: @mipmap/synced}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

Ich möchte ein Bild, wenn „pending“ wahr ist, und ein anderes Bild, wenn „pending“ falsch ist. Aber es wird ein Fehler angezeigt. Wie kann ich diese Funktionalität erreichen?

  • Ich antwortete hier eine gute Lösung. stackoverflow.com/a/52983092/6891563

    – Khemraj Sharma

    25. Oktober 2018 um 6:57 Uhr

Benutzer-Avatar
Spark.Bao

Ich habe das versucht und es funktioniert bei mir (buildToolsVersion: 24.0.1):

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

benutz einfach app:imageResource ersetzen android:src, android:src="https://stackoverflow.com/questions/34607028/@{item.avatarResId}" funktioniert nicht, sonst definieren Sie eine benutzerdefinierte @BindAdapter("android:src") dafür.

aber verwenden app:imageResource muss nicht a definieren @BindAdapter zusätzlich, weil die ImageView eine aufgerufene Methode hat setImageResource()wenn Sie verwenden app:imageResourcewird es rufen setImageResource() automatisch.

  • Danke, es funktioniert. Ich habe gerade ersetzt android:src mit app:imageResource.

    – Waldmann

    22. Februar 2020 um 11:52 Uhr

  • danke @Spark.Bao du hast mich gerettet 😀 es funktioniert

    – Aida

    16. Juli 2020 um 19:56 Uhr

  • Wenn Sie nicht finden können app:imageResource Versuchen app:loadImageResource stattdessen.

    – Hawklike

    19. November 2021 um 8:37 Uhr

  • Denken Sie daran, hinzuzufügen<data><import type="your.package.R"/></data> im XML-Format

    – Zhou Hongbo

    28. März um 8:28 Uhr

Benutzer-Avatar
qinmiao

Die Antwort:

definieren:

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

verwenden:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:scaleType="center"
    android:src="https://stackoverflow.com/questions/34607028/@{viewModel.imageRes, default=@drawable/guide_1}"/>

Benutzer-Avatar
luttu android

Bild so einstellen,

  <ImageView
        android:layout_width="28dp"
        android:layout_height="28dp"
        android:src="https://stackoverflow.com/questions/34607028/@{model.isActive ? @drawable/white_activated_icon :@drawable/activated_icon}"
        tools:src="@mipmap/white_activated_icon" />

  • Ich habe es im Recyclerview-Adapter verwendet, bei dem jedes Element dann 5 ImageView hat. Dies führt zu einer erheblichen Leistungsminderung. Denn bei jedem onBindViewHolder-Aufruf überprüft die Datenbindung if-Anweisungen. Jetzt bevorzuge ich diese Antwort

    – Mohammad Reza Khahani

    5. April 2020 um 6:38 Uhr


  • Das funktioniert bei mir nicht

    – Konstantin Konopko

    27. Dezember 2021 um 17:12 Uhr

Benutzer-Avatar
yoAlex5

Wenn Sie ein Argument wie eine an die Methode übergeben möchten @IdRes Sie können verwenden

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>

Code

@BindingAdapter("load_image")
public static void loadImage(ImageView view, @IdRes int imageId) {
    //Logic
}

Benutzer-Avatar
Rohan Taneja

Sie können dies tun, ohne etwas programmgesteuert zu tun, wenn Ihr Datenmodell die Ressourcen-ID des Bildes enthält.

Beispiel:

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

Fügen Sie einfach die folgende Zeile zu Ihrer imageView hinzu (ich konnte den Code nicht formatieren, als ich ihn dort hinzufügte):

android:src="https://stackoverflow.com/questions/34607028/@{ContextCompat.getDrawable(context,roomInfoItem.resId)}"

wo resId enthält R.drawable.your_image_name

  • Dies funktionierte perfekt für mich. Auch bei Verwendung der Groupie-Datenbindungsbibliothek von Lisa Wray.

    – Patty P

    10. Oktober 2018 um 17:43 Uhr

  • funktioniert einfach so, wie ich es erwartet habe.

    – Padma Kumar

    26. Januar 2020 um 18:13 Uhr

Benutzer-Avatar
piotrek1543

Laut diesem tollen Artikel: Laden von Bildern mit Data Binding und Picasso

Es gibt zwei Möglichkeiten, dies zu tun:

  1. Verwenden @BindingAdapter
  2. ObservableField & benutzerdefiniertes Picasso-Ziel

In Referenz für Android-Entwickler Anleitung zur Datenbindungwürden Sie nur den ersten finden.

Bitte lesen Sie beide Artikel.

Mehr Informationen:

Hoffe es hilft.

  • Dies funktionierte perfekt für mich. Auch bei Verwendung der Groupie-Datenbindungsbibliothek von Lisa Wray.

    – Patty P

    10. Oktober 2018 um 17:43 Uhr

  • funktioniert einfach so, wie ich es erwartet habe.

    – Padma Kumar

    26. Januar 2020 um 18:13 Uhr

Benutzer-Avatar
sasikumar

Weitere Details Siehe hier Einzelheiten Laden von Bildern mit Datenbindung und 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);
    }
}
}

1298730cookie-checkSo legen Sie die Bildressource mithilfe von DataBinding auf ImageView fest [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy