Ich versuche, die Drawable-Ressourcen-ID mithilfe der Datenbindung auf android: src von ImageView zu setzen
Hier ist mein Objekt:
public class Recipe implements Parcelable {
public final int imageResource; // resource ID (e.g. R.drawable.some_image)
public final String title;
// ...
public Recipe(int imageResource, String title /* ... */) {
this.imageResource = imageResource;
this.title = title;
}
// ...
}
Hier ist mein Layout:
<?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">
<data>
<variable
name="recipe"
type="com.example.android.fivewaystocookeggs.Recipe" />
</data>
<!-- ... -->
<ImageView
android:id="@+id/recipe_image_view"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@{recipe.imageResource}" />
<!-- ... -->
</layout>
Und schließlich Aktivitätsklasse:
// ...
public class RecipeActivity extends AppCompatActivity {
public static final String RECIPE_PARCELABLE = "recipe_parcelable";
private Recipe mRecipe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRecipe = getIntent().getParcelableExtra(RECIPE_PARCELABLE);
ActivityRecipeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_recipe);
binding.setRecipe(mRecipe);
}
// ...
}
Es wird überhaupt kein Bild angezeigt. Was mache ich falsch?
Übrigens funktionierte es perfekt mit Standard:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipe);
final ImageView recipeImageView = (ImageView) findViewById(R.id.recipe_image_view);
recipeImageView.setImageResource(mRecipe.imageResource);
}
quelle
@BindingAdapter
. Wert sollte aberandroid:src
nicht seinimageResource
:@BindingAdapter("android:src")
. Danke dir!<ImageView imageResource="@{recipe.imageResource}" />
und@BindingAdapter("imageResource")
. Ich habe gerade einenimageResource="@{recipe.imageResource}"
Teil von Ihrem Code verpasst.app:imageResource
?Es ist überhaupt kein Brauch erforderlich
BindingAdapter
. Benutz einfachund es wird gut funktionieren.
Überprüfen Sie dies , wie es funktioniert.
quelle
definieren:
verwenden:
quelle
Überschreiben Sie niemals Standard-SDK-Attribute, wenn Sie Ihre eigenen erstellen
@BindingAdapter
!Dies ist aus vielen Gründen kein guter Ansatz: Es wird verhindert, dass neue Fixes für das Android SDK-Update für dieses Attribut verwendet werden. Es könnte auch Entwickler verwirren und sicherlich schwierig für die Wiederverwendbarkeit sein (weil es nicht erwartet wird, überschrieben zu werden)
Sie können verschiedene Namespace verwenden wie:
oder
------ Update 2.Jul.2018 starten
Es wird nicht empfohlen, den Namespace zu verwenden. Verwenden Sie daher besser das Präfix oder einen anderen Namen als:
oder
------ Ende Update 2.Jul.2018
Ich würde jedoch eine andere Lösung empfehlen als:
Die Kontextansicht ist immer innerhalb des Bindungsausdrucks verfügbar
@{ ... }
quelle
Damit Kotlin dies in eine Utils-Datei der obersten Ebene einfügt, ist kein statischer / begleitender Kontext erforderlich:
quelle
Aufbauend auf der Antwort von Maher Abuthraa habe ich Folgendes im XML verwendet:
Die
context
Variable ist im Bindungsausdruck ohne Importe verfügbar . Auch kein BrauchBindingAdapter
notwendig. Einzige Einschränkung: Die MethodegetDrawable
ist erst seit API 21 verfügbar.quelle
Je mehr Sie damit machen können
DataBindingAdapter
Stellen Sie einen dieser Typen ein:
Fehlerbild / Platzhalterbild einstellen
Alle Typen getestet
So wird das mit Single Binding Adapter möglich. Kopieren Sie einfach dieses Methodenprojekt.
Grund, warum ich Glide verwendet habe, um alle Objekte zu laden
Wenn Sie mich fragen, warum ich Glide zum Laden der Zeichen- / Ressourcen-ID verwendet habe, könnte ich stattdessen
imageView.setImageBitmap();
oder verwendenimageView.setImageResource();
. Der Grund ist also derWenn Sie Piccaso, Fresso oder eine andere Bildladebibliothek verwenden, können Sie die
loadImageWithGlide
Methode ändern .quelle
quelle
Sie können Folgendes tun
quelle
Ich bin kein Experte für Android, aber ich habe stundenlang versucht, die vorhandenen Lösungen zu entschlüsseln. Das Gute ist, dass ich die ganze Idee der Datenbindung mit verstanden habe
BindingAdapter
etwas besser verstanden habe. Dafür bin ich zumindest dankbar für die vorhandenen Antworten (obwohl stark unvollständig). Hier eine vollständige Aufschlüsselung des Ansatzes:Ich werde das auch
BindingAdapter
in diesem Beispiel verwenden. Vorbereiten derxml
:Also behalte ich hier nur das Wichtige:
SomeViewModel
ist meinViewModel
ich benutze für die Datenbindung. Sie können auch eine Klasse verwenden, die erweitertBaseObservable
und verwendet wird@Bindable
. DasBindingAdapter
in diesem Beispiel muss jedoch nicht in einerViewModel
oderBaseObservable
Klasse sein! Eine einfache Klasse wird es tun! Dies wird später veranschaulicht.app:appIconDrawable="@{model.packageName}"
. Ja ... das hat mir wirklich Kopfschmerzen bereitet! Lassen Sie es uns zusammenfassen:app:appIconDrawable
: Das kann alles sein :app:iCanBeAnything
! Ja wirklich. Sie können auch behalten"android:src"
! Notieren Sie sich jedoch Ihre Wahl, wir werden sie später verwenden!Nehmen wir an, wir verwenden diese einfache Observable-Klasse:
Wie versprochen können Sie die
public static void setImageViewDrawable()
Klasse auch in eine andere Klasse verschieben, z. B. können Sie eine Klasse mit einer Sammlung vonBindingAdapters
:Eine weitere wichtige Bemerkung ist, dass ich in meiner
Observable
KlasseString packageName
zusätzliche Informationen an die weitergegeben habesetImageViewDrawable
. Sie können beispielsweiseint resourceId
auch mit den entsprechenden Gettern / Setzern auswählen , für die der Adapter wird:quelle
Diese Arbeit für mich. Ich hätte es als Kommentar zu @hqzxzwb Antwort hinzugefügt, aber aufgrund von Reputationsbeschränkungen.
Ich habe dies aus meiner Sicht Modell
Dann habe ich in meiner XML
Und das ist es
quelle
Verwenden von Fresco (Facebook-Bildbibliothek)
quelle
In Ihrem Ansichtsstatus oder Ihrer Ansichtsmodellklasse;
In Ihrem XML;
quelle
quelle
Bild wie folgt einstellen,
quelle