Android Kotlin Fundamentals 05.3: Datenbindung mit ViewModel und LiveData

Dieses Codelab ist Teil des Android Kotlin Fundamentals-Kurss. Sie profitieren von diesem Kurs, wenn Sie nacheinander die Codelabs durcharbeiten. Alle Kurs-Codelabs finden Sie auf der Landingpage für Kotlin-Grundlagen für Android-Entwickler.

Einführung

In den vorherigen Codelabs in dieser Lektion haben Sie den Code für die GuessTheWord-App verbessert. Die App nutzt nun ViewModel-Objekte. Daher bleiben App-Daten erhalten, wenn die Gerätekonfiguration geändert wird, z. B. bei Bildschirmdrehungen und Änderungen der Tastaturverfügbarkeit. Außerdem haben Sie eine beobachtbare LiveData hinzugefügt, sodass Aufrufe automatisch benachrichtigt werden, wenn sich Daten ändern.

In diesem Codelab arbeiten Sie weiterhin mit der GuessTheWord-App. Sie binden Aufrufe an die ViewModel-Klassen in der App, sodass die Ansichten in Ihrem Layout direkt mit den ViewModel-Objekten kommunizieren. Bislang wurden in deiner App Aufrufe über die App-Fragmente indirekt mit ViewModel kommuniziert. Nachdem Sie die Datenbindung in die ViewModel-Objekte integriert haben, benötigen Sie keine Klick-Handler mehr in den App-Fragmenten. Daher müssen Sie sie entfernen.

Außerdem ändern Sie die GuessTheWord-App so, dass LiveData als Datenbindungsquelle verwendet wird, um die UI über Änderungen der Daten zu informieren, ohne LiveData-Observer-Methoden zu verwenden.

Was Sie bereits wissen sollten

  • Grundlegende Android-Apps in Kotlin erstellen.
  • Funktionsweise von Aktivitäts- und Fragmentlebenszyklen
  • So verwenden Sie ViewModel-Objekte in Ihrer App.
  • Informationen zum Speichern von Daten mit LiveData in einem ViewModel.
  • Hinzufügen von Beobachtermethoden, um die Änderungen in LiveData-Daten zu beobachten.

Lerninhalte

  • Elemente der Datenbindungsbibliothek verwenden.
  • So binden Sie ViewModel in Datenbindung ein.
  • So binden Sie LiveData in Datenbindung ein.
  • So werden Listener-Bindungen verwendet, um die Klick-Listener in einem Fragment zu ersetzen.
  • So fügen Sie Strings zur Datenbindung eine Stringformatierung hinzu.

Aufgaben

  • Die Ansichten in den GuessTheWord-Layouts kommunizieren indirekt mit ViewModel-Objekten und verwenden die UI-Controller (Fragmente), um Informationen weiterzuleiten. In diesem Codelab binden Sie die Ansichten der App an ViewModel-Objekte, sodass die Ansichten direkt mit den ViewModel-Objekten kommunizieren.
  • Sie ändern die Anwendung so, dass LiveData als Datenbindungsquelle verwendet wird. Nach der Änderung werden die Änderungen über die Daten von den LiveData-Objekten an die UI gesendet und die LiveData-Beobachtermethoden sind nicht mehr erforderlich.

In Modul 5 der Lektion 5 entwickeln Sie die GuessTheWord-App, die mit dem Startcode beginnt. GuessTheWord ist ein Spiel für zwei Spieler, das im Spiel Charades entwickelt und in dem Spieler die höchstmögliche Punktzahl erzielen.

Der erste Spieler betrachtet die Wörter in der App und agiert nacheinander. Dabei wird dem zweiten Spieler das Wort nicht angezeigt. Der zweite Spieler versucht, das Wort zu erraten.

Zum Spielen öffnet der erste Spieler die App auf dem Gerät und sieht ein Wort, z. B. „Gitarre“, unten.

Der erste Spieler führt das Wort aus und achte darauf, nicht das Wort selbst zu sagen.

  • Wenn der zweite Spieler das Wort richtig errät, klickt der erste Spieler auf OK. Dadurch wird die Anzahl um eins erhöht und das nächste Wort angezeigt.
  • Wenn der zweite Spieler das Wort nicht erraten kann, drückt der erste Spieler die Schaltfläche Überspringen. Dadurch wird die Anzahl der Wörter um eins verringert und zum nächsten Wort springen.
  • Klicken Sie auf die Schaltfläche Spiel beenden, um das Spiel zu beenden. Diese Funktion befindet sich im Starter-Code für das erste Codelab der Serie.

In diesem Codelab optimieren Sie die GuessTheWord-App, indem Sie die Datenbindung mit LiveData in ViewModel-Objekte integrieren. Hiermit wird die Kommunikation zwischen den Ansichten im Layout und den ViewModel-Objekten automatisiert und du kannst den Code mit LiveData vereinfachen.

Titelbildschirm

Spiele-Bildschirm

Index erstellen

In dieser Aufgabe suchen und starten Sie den Startcode für dieses Codelab. Sie können die GuessTheWord App, die Sie im vorherigen Codelab erstellt haben, als Startcode verwenden oder eine Start-App herunterladen.

  1. Optional: Wenn Sie den Code aus dem vorherigen Codelab nicht verwenden, laden Sie den Startcode für das Codelab herunter. Entpacken Sie den Code und öffnen Sie das Projekt in Android Studio.
  2. Führe die App aus und spiel das Spiel.
  3. Beachten Sie, dass mit der Schaltfläche Ok das nächste Wort angezeigt wird und die Punktzahl um eins erhöht wird. Mit der Schaltfläche Überspringen wird das nächste Wort angezeigt und die Punktzahl um eins verringert. Über die Schaltfläche Spiel beenden wird das Spiel beendet.
  4. Gehen Sie die Wörter durch und stellen Sie fest, dass die App automatisch zum Bildschirm mit den Punktzahlen wechselt.

In einem vorherigen Codelab haben Sie Datenbindungen als typsichere Möglichkeit verwendet, um auf die Ansichten in der GuessTheWord-App zuzugreifen. Der wirkliche Nutzen der Datenbindung besteht jedoch darin, was der Name vorgibt: Bindung von Daten direkt an die App-Objekte in Ihrer App.

Aktuelle App-Architektur

In deiner App werden die Ansichten im XML-Layout definiert und die Daten für diese Ansichten werden in ViewModel-Objekten gespeichert. Zwischen jeder Ansicht und der entsprechenden ViewModel befindet sich ein UI-Controller, der als Relais zwischen ihnen dient.

Beispiel:

  • Die Schaltfläche OK ist in der Layoutdatei game_fragment.xml als Button-Ansicht definiert.
  • Wenn der Nutzer auf die Schaltfläche Ok tippt, wird ein Klick-Listener im GameFragment-Fragment den entsprechenden Klick-Listener in GameViewModel aufrufen.
  • Der Faktor wird in der GameViewModel aktualisiert.

Die Datenansichten Button und GameViewModel kommunizieren nicht direkt. Sie benötigen den Klick-Listener in GameFragment.

ViewModel an die Datenbindung übergeben

Es wäre einfacher, wenn die Ansichten im Layout direkt mit den Daten in den ViewModel-Objekten kommunizieren, ohne auf die Benutzeroberflächen-Controller als Vermittler zurückgreifen zu müssen.

ViewModel-Objekte enthalten alle UI-Daten in der GuessTheWord-App. Wenn ViewModel-Objekte an die Datenbindung übergeben werden, können Sie die Kommunikation zwischen den Ansichten und den ViewModel-Objekten automatisieren.

In dieser Aufgabe verknüpfen Sie die Klassen GameViewModel und ScoreViewModel mit den entsprechenden XML-Layouts. Außerdem richten Sie Listener-Bindungen ein, um Klickereignisse zu verarbeiten.

Schritt 1: Datenbindung für GameViewModel hinzufügen

In diesem Schritt verknüpfen Sie GameViewModel mit der entsprechenden Layoutdatei game_fragment.xml.

  1. Fügen Sie in der Datei game_fragment.xml eine Datenbindungsvariable vom Typ GameViewModel hinzu. Wenn in Android Studio Fehler auftreten, bereinigen Sie das Projekt und erstellen Sie es neu.
<layout ...>

   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  
   <androidx.constraintlayout...
  1. Übergeben Sie in der Datei GameFragment die GameViewModelDatenbindung an die Datenbindung.

    Dazu weisen Sie der im vorherigen Schritt deklarierten Variable viewModel binding.gameViewModel zu. Fügen Sie diesen Code in onCreateView() ein, nachdem viewModel initialisiert wurde. Wenn in Android Studio Fehler auftreten, bereinigen Sie das Projekt und erstellen Sie es neu.
// Set the viewmodel for databinding - this allows the bound layout access 
// to all the data in the ViewModel
binding.gameViewModel = viewModel

Schritt 2: Listener-Bindungen für die Ereignisverarbeitung verwenden

Listener-Bindungen sind Bindungsausdrücke, die ausgeführt werden, wenn Ereignisse wie onClick(), onZoomIn() oder onZoomOut() ausgelöst werden. Listener-Bindungen werden als Lambda-Ausdrücke geschrieben.

Durch die Datenbindung wird ein Listener erstellt und der Listener für die Ansicht festgelegt. Wenn das beobachtete Ereignis eintritt, wertet der Listener den Lambda-Ausdruck aus. Listener-Bindungen funktionieren mit dem Android-Gradle-Plug-in in der Version 2.0 oder höher. Weitere Informationen finden Sie unter Layouts und Bindungsausdrücke.

In diesem Schritt ersetzen Sie die Klick-Listener in der GameFragment durch Listener-Bindungen in der Datei game_fragment.xml.

  1. Fügen Sie in game_fragment.xml das Attribut onClick dem skip_button hinzu. Definieren Sie einen Bindungsausdruck und rufen Sie die Methode onSkip() in GameViewModel auf. Dieser Bindungsausdruck wird als Listener-Bindung bezeichnet.
<Button
   android:id="@+id/skip_button"
   ...
   android:onClick="@{() -> gameViewModel.onSkip()}"
   ... />
  1. Ebenso binden Sie das Klickereignis des correct_button an die Methode onCorrect() in GameViewModel.
<Button
   android:id="@+id/correct_button"
   ...
   android:onClick="@{() -> gameViewModel.onCorrect()}"
   ... />
  1. Verknüpfe das Klickereignis des end_game_button mit der Methode onGameFinish() in GameViewModel.
<Button
   android:id="@+id/end_game_button"
   ...
   android:onClick="@{() -> gameViewModel.onGameFinish()}"
   ... />
  1. Entfernen Sie in GameFragment die Anweisungen, durch die die Klick-Listener festgelegt werden, und entfernen Sie die Funktionen, die die Klick-Listener aufrufen. Du benötigst sie nicht mehr.

Zu entfernender Code:

binding.correctButton.setOnClickListener { onCorrect() }
binding.skipButton.setOnClickListener { onSkip() }
binding.endGameButton.setOnClickListener { onEndGame() }

/** Methods for buttons presses **/
private fun onSkip() {
   viewModel.onSkip()
}
private fun onCorrect() {
   viewModel.onCorrect()
}
private fun onEndGame() {
   gameFinished()
}

Schritt 3: Datenbindung für ScoreViewModel hinzufügen

In diesem Schritt verknüpfen Sie ScoreViewModel mit der entsprechenden Layoutdatei score_fragment.xml.

  1. Fügen Sie in der Datei score_fragment.xml eine Bindungsvariable vom Typ ScoreViewModel hinzu. Dieser Schritt ähnelt den Schritten, die Sie bei GameViewModel oben ausgeführt haben.
<layout ...>
   <data>
       <variable
           name="scoreViewModel"
           type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
   </data>
   <androidx.constraintlayout.widget.ConstraintLayout
  1. Fügen Sie in score_fragment.xml das Attribut onClick dem play_again_button hinzu. Definieren Sie eine Listener-Bindung und rufen Sie die Methode onPlayAgain() in ScoreViewModel auf.
<Button
   android:id="@+id/play_again_button"
   ...
   android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
   ... />
  1. Initialisiere in ScoreFragment innerhalb von onCreateView() die viewModel. Initialisieren Sie dann die Bindungsvariable binding.scoreViewModel.
viewModel = ...
binding.scoreViewModel = viewModel
  1. Entfernen Sie in ScoreFragment den Code, der den Klick-Listener für die playAgainButton festlegt. Wenn in Android Studio ein Fehler auftritt, bereinigen Sie das Projekt und erstellen Sie es neu.

Zu entfernender Code:

binding.playAgainButton.setOnClickListener {  viewModel.onPlayAgain()  }
  1. Führe deine App aus. Die App sollte wie vorher funktionieren, aber jetzt kommunizieren die Schaltflächenansichten direkt mit den ViewModel-Objekten. Die Ansichten kommunizieren nicht mehr über die Klick-Handler in ScoreFragment.

Fehlermeldungen bei Datenbindungen beheben

Wenn für eine Anwendung Datenbindung verwendet wird, generiert der Kompilierungsprozess Zwischenklassen, die für die Datenbindung verwendet werden. Apps können Fehler haben, die von Android Studio nicht erkannt werden, bis du versuchst, die App zu kompilieren. Daher siehst du keine Warnungen oder keinen roten Code, während du den Code schreibst. Beim Kompilieren erhalten Sie jedoch kryptische Fehler, die aus den generierten Zwischenklassen stammen.

Wenn Sie eine Fehlermeldung erhalten:

  1. Sehen Sie sich die Meldung im Bereich Erstellen von Android Studio an. Wenn Sie einen Standort sehen, der auf databinding endet, tritt ein Fehler bei der Datenbindung auf.
  2. Suchen Sie in der Layout-XML-Datei nach Fehlern in onClick-Attributen, die Datenbindung verwenden. Suchen Sie die Funktion, die der Lambda-Ausdruck aufruft, und prüfen Sie, ob sie vorhanden ist.
  3. Prüfen Sie im Abschnitt <data> der XML-Datei die Rechtschreibung der Datenbindungsvariable.

Achten Sie beispielsweise auf den Rechtschreibfehler des Funktionsnamens onCorrect() im folgenden Attributwert:

android:onClick="@{() -> gameViewModel.onCorrectx()}"

Beachte außerdem den Rechtschreibfehler von gameViewModel im <data>-Abschnitt der XML-Datei:

<data>
   <variable
       name="gameViewModelx"
       type="com.example.android.guesstheword.screens.game.GameViewModel" />
</data>

Android Studio erkennt solche Fehler erst, wenn Sie die App kompilieren. Der Compiler zeigt dann eine Fehlermeldung wie die folgende auf:

error: cannot find symbol
import com.example.android.guesstheword.databinding.GameFragmentBindingImpl"

symbol:   class GameFragmentBindingImpl
location: package com.example.android.guesstheword.databinding

Die Datenbindung funktioniert gut mit LiveData, die mit ViewModel-Objekten verwendet werden. Nachdem Sie die Datenbindung für die ViewModel-Objekte hinzugefügt haben, können Sie LiveData einbinden.

Bei dieser Aufgabe ändern Sie die GuessTheWord-App so, dass LiveData als Datenbindungsquelle verwendet wird, um die UI über Änderungen in den Daten zu informieren, ohne die observer-Methode LiveData zu verwenden.

Schritt 1: Wort „LiveData“ in die Datei „game_fragment.xml“ einfügen

In diesem Schritt binden Sie die aktuelle Worttextansicht direkt an das LiveData-Objekt in ViewModel.

  1. Fügen Sie in game_fragment.xml der Textansicht in word_text hinzu.

Setzen Sie ihn auf das Objekt LiveData word aus GameViewModel mithilfe der Bindungsvariablen gameViewModel.

<TextView
   android:id="@+id/word_text"
   ...
   android:text="@{gameViewModel.word}"
   ... />

Beachte, dass du word.value nicht verwenden musst. Du kannst stattdessen das tatsächliche LiveData-Objekt verwenden. Das Objekt LiveData zeigt den aktuellen Wert von word an. Wenn der Wert von word null ist, zeigt das LiveData-Objekt einen leeren String an.

  1. Legen Sie in GameFragment nach der Initialisierung von gameViewModel in onCreateView() die aktuelle Aktivität als Lebenszyklusinhaber der Variablen binding fest. Definiert den Bereich des oben stehenden LiveData-Objekts. Dadurch kann das Objekt die Ansichten im Layout game_fragment.xml automatisch aktualisieren.
binding.gameViewModel = ...
// Specify the current activity as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = this
  1. Entfernen Sie in GameFragment den Beobachter für LiveData word.

Zu entfernender Code:

/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
   binding.wordText.text = newWord
})
  1. Führe deine App aus und spiel das Game. Das aktuelle Wort wird im Benutzeroberflächencontroller nun ohne Beobachtungsmethode aktualisiert.

Schritt 2: Punktzahl „LiveData“ der Datei „score_fragment.xml“ hinzufügen

In diesem Schritt binden Sie LiveData score an den Bewertungstextaufruf im Punktzahlfragment an.

  1. Fügen Sie in score_fragment.xml der Ansicht „Text“ den Wert android:text hinzu. Weisen Sie dem Attribut text den Wert scoreViewModel.score zu. Da es sich bei score um eine Ganzzahl handelt, konvertieren Sie sie mithilfe von String.valueOf() in einen String.
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{String.valueOf(scoreViewModel.score)}"
   ... />
  1. Legen Sie in ScoreFragment nach dem Initialisieren der scoreViewModel die aktuelle Aktivität als Lebenszyklusinhaber der Variable binding fest.
binding.scoreViewModel = ...
// Specify the current activity as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = this
  1. Entferne in ScoreFragment den Observer für das score-Objekt.

Zu entfernender Code:

// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Führe deine App aus und spiel das Game. Beachten Sie, dass die Punktzahl im Punktzahlfragment korrekt angezeigt wird und kein Observator im Score-Fragment verwendet wird.

Schritt 3: Stringformatierung mit Datenbindung hinzufügen

Im Layout können Sie eine Stringformatierung sowie eine Datenbindung hinzufügen. Bei dieser Aufgabe formatieren Sie das aktuelle Wort so, dass es Anführungszeichen enthält. Außerdem formatieren Sie den String so, dass ihm der aktuelle Wert vorangestellt wird (siehe folgende Abbildung).

  1. Füge in string.xml die folgenden Strings hinzu, mit denen du die Textansichten word und score formatieren möchtest. %s und %d sind die Platzhalter für das aktuelle Wort und die aktuelle Punktzahl.
<string name="quote_format">\"%s\"</string>
<string name="score_format">Current Score: %d</string>
  1. Aktualisieren Sie in game_fragment.xml das Attribut text der Textansicht in word_text, um die String-Ressource quote_format zu verwenden. Pass in gameViewModel.word. Dadurch wird das aktuelle Wort als Argument an den Formatierungsstring übergeben.
<TextView
   android:id="@+id/word_text"
   ...
   android:text="@{@string/quote_format(gameViewModel.word)}"
   ... />
  1. Formatieren Sie die score-Textansicht ähnlich wie bei der word_text. Fügen Sie in der game_fragment.xml das Attribut text zur Textansicht in score_text hinzu. Verwenden Sie die String-Ressource score_format, die ein numerisches Argument verwendet, das durch den Platzhalter %d dargestellt wird. Übergeben Sie das LiveData-Objekt score als Argument an diesen Formatierungsstring.
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{@string/score_format(gameViewModel.score)}"
   ... />
  1. Entfernen Sie in der Klasse GameFragment in der onCreateView()-Methode den Observer-Code score.

Zu entfernender Code:

viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Reinigen, neu erstellen und ausführen, dann spielen. Beachten Sie, dass das aktuelle Wort und die Punktzahl auf dem Bildschirm des Spiels formatiert sind.

Glückwunsch! Sie haben LiveData und ViewModel mit Datenbindung in Ihre App eingebunden. So können die Ansichten in Ihrem Layout direkt mit der ViewModel kommunizieren, ohne Klick-Handler im Fragment zu verwenden. Außerdem haben Sie LiveData-Objekte als Datenbindungsquelle verwendet, um die Benutzeroberfläche automatisch über Änderungen an den Daten ohne die Observer-Methoden LiveData zu benachrichtigen.

Android Studio-Projekt: GuessTheWord

  • Die Datenbindungsbibliothek funktioniert nahtlos mit Android-Architekturkomponenten wie ViewModel und LiveData.
  • Die Layouts in Ihrer App können sich an die Daten in den Architekturkomponenten binden, sodass Sie bereits den Lebenszyklus der UI-Controller verwalten können und Informationen zu Änderungen der Daten erhalten.

ViewModel-Datenbindung

  • Sie können eine ViewModel mithilfe von Datenbindung mit einem Layout verknüpfen.
  • ViewModel-Objekte enthalten die UI-Daten. Durch das Übergeben von ViewModel-Objekten in die Datenbindung können Sie einen Teil der Kommunikation zwischen den Ansichten und den ViewModel-Objekten automatisieren.

So verknüpfst du ein ViewModel mit einem Layout:

  • Fügen Sie in der Layoutdatei eine Datenbindungsvariable des Typs ViewModel hinzu.
   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  • Übergeben Sie in der Datei GameFragment den GameViewModel in die Datenbindung.
binding.gameViewModel = viewModel

Listener-Bindungen

  • Listener-Bindungen sind Bindungsausdrücke im Layout, die ausgeführt werden, wenn Klickereignisse wie onClick() ausgelöst werden.
  • Listener-Bindungen werden als Lambda-Ausdrücke geschrieben.
  • Mithilfe von Listener-Bindungen ersetzen Sie die Klick-Listener in den UI-Controllern durch Listener-Bindungen in der Layoutdatei.
  • Durch die Datenbindung wird ein Listener erstellt und der Listener für die Ansicht festgelegt.
 android:onClick="@{() -> gameViewModel.onSkip()}"

LiveData zur Datenbindung hinzufügen

  • LiveData-Objekte können als Datenbindungsquelle verwendet werden, um die UI automatisch über Änderungen in den Daten zu informieren.
  • Sie können die Ansicht direkt an das Objekt LiveData in ViewModel binden. Wenn sich LiveData in ViewModel ändert, können die Ansichten im Layout ohne die Observer-Methoden in den UI-Controllern automatisch aktualisiert werden.
android:text="@{gameViewModel.word}"
  • Damit die Datenbindung LiveData funktioniert, legen Sie die aktuelle Aktivität (der UI-Controller) als Lebenszyklusinhaber der Variable binding im UI-Controller fest.
binding.lifecycleOwner = this

Stringformatierung mit Datenbindung

  • Mithilfe der Datenbindung können Sie eine Stringressource mit Platzhaltern wie %s für Strings und %d für Ganzzahlen formatieren.
  • Übergeben Sie das LiveData-Objekt als Argument an den Formatierungsstring, um das text-Attribut der Ansicht zu aktualisieren.
 android:text="@{@string/quote_format(gameViewModel.word)}"

Udacity-Kurs:

Android-Entwicklerdokumentation:

In diesem Abschnitt werden mögliche Hausaufgaben für Schüler oder Studenten aufgeführt, die an diesem von einem Kursleiter geleiteten Codelab arbeiten. Die Lehrkraft kann Folgendes tun:

  • Bei Bedarf können Sie die entsprechenden Aufgaben zuweisen.
  • Schülern mitteilen, wie sie Aufgaben für die Aufgabe abgeben
  • Benoten Sie die Hausaufgaben.

Lehrkräfte können diese Vorschläge so oft oder so oft verwenden, wie sie möchten. anderen Aufgaben können sie nach Belieben zugewiesen werden.

Wenn Sie alleine an diesem Codelab arbeiten, können Sie Ihr Wissen mit diesen Hausaufgaben testen.

Diese Fragen beantworten

Frage 1

Welche der folgenden Aussagen trifft nicht auf Bindungs-Listener zu?

  • Listener-Bindungen sind Bindungsausdrücke, die ausgeführt werden, wenn ein Ereignis eintritt.
  • Listener-Bindungen funktionieren mit allen Versionen des Android-Gradle-Plug-ins.
  • Listener-Bindungen werden als Lambda-Ausdrücke geschrieben.
  • Listener-Bindungen sind ähnlich wie Methodenreferenzen, aber Sie können damit beliebige Ausdrücke zur Datenbindung ausführen.

Frage 2

Angenommen, deine App enthält diese String-Ressource:
<string name="generic_name">Hello %s</string>

Welche der folgenden Antworten ist korrekt, um den String mit dem Datenbindungsausdruck zu formatieren?

  • android:text= "@{@string/generic_name(user.name)}"
  • android:text= "@{string/generic_name(user.name)}"
  • android:text= "@{@generic_name(user.name)}"
  • android:text= "@{@string/generic_name,user.name}"

Frage 3

Wann wird ein Listener-Bindungsausdruck ausgewertet und ausgeführt?

  • Wenn die Daten des LiveData geändert werden
  • Wenn eine Aktivität durch eine Konfigurationsänderung neu erstellt wird
  • Wenn ein Ereignis wie onClick() eintritt
  • Wenn die Aktivität in den Hintergrund geht

Nächste Lektion: 5.4: LiveData-Transformationen

Links zu anderen Codelabs in diesem Kurs finden Sie auf der Landingpage zu Kotlin-Grundlagen für Android.