Grundlagen von Android und Kotlin 05.3: Data Binding mit ViewModel und LiveData

Dieses Codelab ist Teil des Kurses „Grundlagen von Android und Kotlin“. Sie können diesen Kurs am besten nutzen, wenn Sie die Codelabs der Reihe nach durcharbeiten. Alle Codelabs des Kurses sind auf der Landingpage für Codelabs zu den Grundlagen von Android und Kotlin aufgeführt.

Einführung

In den vorherigen Codelabs in dieser Lektion haben Sie den Code für die GuessTheWord-App verbessert. Die App verwendet jetzt ViewModel-Objekte, sodass App-Daten Gerätekonfigurationsänderungen wie Bildschirmrotationen und Änderungen der Tastaturverfügbarkeit überstehen. Außerdem haben Sie das Observable LiveData hinzugefügt, sodass Ansichten automatisch benachrichtigt werden, wenn sich beobachtete Daten ändern.

In diesem Codelab arbeiten Sie weiterhin mit der App „GuessTheWord“. Sie binden Ansichten an die ViewModel-Klassen in der App, damit die Ansichten in Ihrem Layout direkt mit den ViewModel-Objekten kommunizieren. Bisher haben Ansichten in Ihrer App indirekt über die Fragmente der App mit dem ViewModel kommuniziert. Nachdem Sie die Datenbindung in die ViewModel-Objekte eingebunden haben, benötigen Sie keine Click-Handler mehr in den Fragmenten der App. Entfernen Sie sie also.

Außerdem ändern Sie die GuessTheWord-App so, dass LiveData als Datenbindungsquelle verwendet wird, um die Benutzeroberfläche über Änderungen an den Daten zu informieren, ohne LiveData-Beobachtermethoden zu verwenden.

Was Sie bereits wissen sollten

  • So erstellen Sie grundlegende Android-Apps in Kotlin.
  • So funktionieren die Lebenszyklen von Aktivitäten und Fragmenten.
  • ViewModel-Objekte in Ihrer App verwenden
  • So speichern Sie Daten mit LiveData in einem ViewModel.
  • So fügen Sie Beobachtermethoden hinzu, um die Änderungen in LiveData-Daten zu beobachten.

Lerninhalte

  • Verwendung von Elementen der Data Binding Library
  • ViewModel mit der Datenbindung integrieren
  • LiveData mit der Datenbindung integrieren
  • Listener-Bindungen verwenden, um die Klick-Listener in einem Fragment zu ersetzen.
  • So fügen Sie Datenbindungs-Ausdrücken Stringformatierung hinzu.

Aufgaben

  • Die Ansichten in den GuessTheWord-Layouts kommunizieren indirekt mit ViewModel-Objekten. Dazu werden UI-Controller (Fragmente) verwendet, 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 App so, dass LiveData als Datenbindungsquelle verwendet wird. Nach dieser Änderung benachrichtigen die LiveData-Objekte die Benutzeroberfläche über Änderungen an den Daten. Die LiveData-Beobachtermethoden sind nicht mehr erforderlich.

In den Codelabs zu Lektion 5 entwickeln Sie die App „GuessTheWord“ auf Grundlage von Startcode. GuessTheWord ist ein Schattenspiel für zwei Spieler, bei dem die Spieler zusammenarbeiten, um die höchstmögliche Punktzahl zu erreichen.

Der erste Spieler sieht sich die Wörter in der App an und stellt sie nacheinander dar, ohne dem zweiten Spieler das Wort zu zeigen. Der zweite Spieler versucht, das Wort zu erraten.

Um das Spiel zu starten, öffnet der erste Spieler die App auf dem Gerät und sieht ein Wort, z. B. „Gitarre“, wie im Screenshot unten zu sehen.

Der erste Spieler stellt das Wort dar, ohne es auszusprechen.

  • Wenn der zweite Spieler das Wort richtig errät, drückt der erste Spieler auf die Schaltfläche Got It (Erraten). 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 um eins verringert und zum nächsten Wort gesprungen.
  • Drücken Sie die Schaltfläche Spiel beenden, um das Spiel zu beenden. (Diese Funktion ist nicht im Startercode für das erste Codelab der Reihe enthalten.)

In diesem Codelab verbessern Sie die App „GuessTheWord“, indem Sie die Datenbindung mit LiveData in ViewModel-Objekten integrieren. Dadurch wird die Kommunikation zwischen den Ansichten im Layout und den ViewModel-Objekten automatisiert und Sie können Ihren Code mithilfe von LiveData vereinfachen.

Titelbildschirm

Spielbildschirm

Bewertungsbildschirm

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

  1. (Optional) Wenn Sie den Code aus dem vorherigen Codelab nicht verwenden, laden Sie den Startcode für dieses Codelab herunter. Entpacken Sie den Code und öffnen Sie das Projekt in Android Studio.
  2. Führen Sie die App aus und spielen Sie das Spiel.
  3. Beachten Sie, dass auf der Schaltfläche Verstanden das nächste Wort angezeigt wird und die Punktzahl um eins erhöht wird, während auf der Schaltfläche Überspringen das nächste Wort angezeigt wird und die Punktzahl um eins verringert wird. Mit der Schaltfläche Spiel beenden wird das Spiel beendet.
  4. Gehen Sie alle Wörter durch. Die App wechselt automatisch zum Bildschirm mit der Punktzahl.

In einem vorherigen Codelab haben Sie die Datenbindung als typsichere Methode für den Zugriff auf die Ansichten in der GuessTheWord-App verwendet. Die eigentliche Stärke der Datenbindung liegt jedoch darin, dass sie Daten direkt an die Ansichtsobjekte in Ihrer App bindet.

Aktuelle App-Architektur

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

Beispiel:

  • Die Schaltfläche Ok ist in der Layoutdatei game_fragment.xml als Button-Ansicht definiert.
  • Wenn der Nutzer auf die Schaltfläche Got It (Okay) tippt, ruft ein Klick-Listener im GameFragment-Fragment den entsprechenden Klick-Listener in GameViewModel auf.
  • Der Wert wird in der GameViewModel aktualisiert.

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

ViewModel, das an die Datenbindung übergeben wird

Es wäre einfacher, wenn die Ansichten im Layout direkt mit den Daten in den ViewModel-Objekten kommunizieren würden, ohne dass UI-Controller als Vermittler erforderlich sind.

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

In dieser Aufgabe ordnen Sie die Klassen GameViewModel und ScoreViewModel den entsprechenden XML-Layouts zu. Außerdem richten Sie Listener-Bindungen ein, um Click-Events zu verarbeiten.

Schritt 1: Datenbindung für das 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 GameViewModel an die Datenbindung.

    Weisen Sie dazu viewModel der Variablen binding.gameViewModel zu, die Sie im vorherigen Schritt deklariert haben. 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 für die Ansicht festgelegt. Wenn das Ereignis eintritt, auf das gewartet wird, wertet der Listener den Lambda-Ausdruck aus. Listener-Bindungen funktionieren mit dem Android Gradle-Plug-in ab Version 2.0. Weitere Informationen finden Sie unter Layouts und Bindungsausdrücke.

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

  1. Fügen Sie in game_fragment.xml das Attribut onClick zum 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. Binden Sie das Click-Ereignis des correct_button-Elements an die onCorrect()-Methode im GameViewModel.
<Button
   android:id="@+id/correct_button"
   ...
   android:onClick="@{() -> gameViewModel.onCorrect()}"
   ... />
  1. Binde das Klickereignis von end_game_button an die Methode onGameFinish() im GameViewModel.
<Button
   android:id="@+id/end_game_button"
   ...
   android:onClick="@{() -> gameViewModel.onGameFinish()}"
   ... />
  1. Entfernen Sie in GameFragment die Anweisungen, mit denen die Klick-Listener festgelegt werden, und entfernen Sie die Funktionen, die von den Klick-Listenern aufgerufen werden. Sie benötigen 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 das 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 dem, was Sie oben für GameViewModel getan 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 zum play_again_button hinzu. Definieren Sie eine Listener-Bindung und rufen Sie die Methode onPlayAgain() in der ScoreViewModel auf.
<Button
   android:id="@+id/play_again_button"
   ...
   android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
   ... />
  1. Initialisieren Sie 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, mit dem der Klick-Listener für playAgainButton festgelegt wird. Wenn in Android Studio ein Fehler angezeigt wird, bereinigen Sie das Projekt und erstellen Sie es neu.

Zu entfernender Code:

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

Fehlermeldungen zur Datenbindung beheben

Wenn eine App die Datenbindung verwendet, werden während des Kompilierungsprozesses Zwischenklassen generiert, die für die Datenbindung verwendet werden. Eine App kann Fehler enthalten, die Android Studio erst beim Kompilieren der App erkennt. Daher werden beim Schreiben des Codes keine Warnungen oder roter Code angezeigt. Zur Kompilierzeit erhalten Sie jedoch kryptische Fehler, die von den generierten Zwischenklassen stammen.

Wenn Sie eine kryptische Fehlermeldung erhalten:

  1. Sehen Sie sich die Meldung im Bereich Build von Android Studio genau an. Wenn Sie einen Speicherort sehen, der mit databinding endet, liegt ein Fehler bei der Datenbindung vor.
  2. Prüfen Sie in der XML-Layoutdatei, ob in onClick-Attributen, die die Datenbindung verwenden, Fehler enthalten sind. Suchen Sie nach der Funktion, die vom Lambda-Ausdruck aufgerufen wird, und prüfen Sie, ob sie vorhanden ist.
  3. Prüfen Sie im Abschnitt <data> der XML-Datei die Schreibweise der Variable für die Datenbindung.

Beachten Sie beispielsweise die falsche Schreibweise des Funktionsnamens onCorrect() im folgenden Attributwert:

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

Beachten Sie auch die Falschschreibung von gameViewModel im Abschnitt <data> 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 gibt dann eine Fehlermeldung wie die folgende aus:

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, das mit ViewModel-Objekten verwendet wird. Nachdem Sie den ViewModel-Objekten die Datenbindung hinzugefügt haben, können Sie LiveData einbinden.

In dieser Aufgabe ändern Sie die GuessTheWord-App so, dass LiveData als Datenbindungsquelle verwendet wird, um die Benutzeroberfläche über Änderungen an den Daten zu informieren, ohne die LiveData-Beobachtermethoden zu verwenden.

Schritt 1: „word“ LiveData-Objekt zur Datei „game_fragment.xml“ hinzufügen

In diesem Schritt binden Sie die Textansicht für das aktuelle Wort direkt an das LiveData-Objekt in ViewModel.

  1. Fügen Sie in game_fragment.xml das Attribut android:text zur Textansicht word_text hinzu.

Legen Sie es auf das LiveData-Objekt word aus GameViewModel fest. Verwenden Sie dazu die Bindungsvariable gameViewModel.

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

Sie müssen word.value nicht verwenden. Stattdessen können Sie das tatsächliche LiveData-Objekt verwenden. Das LiveData-Objekt zeigt den aktuellen Wert von word an. Wenn der Wert von word null ist, wird im LiveData-Objekt ein leerer String angezeigt.

  1. Legen Sie in der GameFragment in onCreateView() nach der Initialisierung der gameViewModel die aktuelle Aktivität als Lifecycle-Inhaber der binding-Variablen fest. Dadurch wird der Umfang des LiveData-Objekts oben definiert. Das Objekt kann 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 Observer für LiveData word.

Zu entfernender Code:

/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
   binding.wordText.text = newWord
})
  1. Führen Sie die App aus und spielen Sie das Spiel. Das aktuelle Wort wird jetzt ohne eine Observer-Methode im UI-Controller aktualisiert.

Schritt 2: LiveData für den Spielstand zur Datei „score_fragment.xml“ hinzufügen

In diesem Schritt binden Sie LiveData score an die Textansicht für die Punktzahl im Score-Fragment.

  1. Fügen Sie in score_fragment.xml das Attribut android:text zur Textansicht der Punktzahl hinzu. Weisen Sie scoreViewModel.score dem Attribut text zu. Da score eine Ganzzahl ist, muss sie mit String.valueOf() in einen String umgewandelt werden.
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{String.valueOf(scoreViewModel.score)}"
   ... />
  1. Legen Sie in ScoreFragment nach der Initialisierung von scoreViewModel die aktuelle Aktivität als Lifecycle-Inhaber der Variablen 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. Entfernen Sie 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ühren Sie die App aus und spielen Sie das Spiel. Beachten Sie, dass der Wert im Score-Fragment korrekt angezeigt wird, ohne dass ein Beobachter im Score-Fragment vorhanden ist.

Schritt 3: Stringformatierung mit Datenbindung hinzufügen

Im Layout können Sie neben der Datenbindung auch die Stringformatierung hinzufügen. In dieser Aufgabe formatieren Sie das aktuelle Wort, indem Sie Anführungszeichen darum setzen. Außerdem formatieren Sie den Punktzahlstring, um ihm das Präfix Current Score voranzustellen, wie in der folgenden Abbildung dargestellt.

  1. Fügen Sie in string.xml die folgenden Strings hinzu, die Sie zum Formatieren der Textansichten word und score verwenden. %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 word_text, damit die String-Ressource quote_format verwendet wird. Übergeben Sie einen Wert für 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 Textansicht score ähnlich wie word_text. Fügen Sie im game_fragment.xml das Attribut text zur Textansicht score_text hinzu. Verwenden Sie die String-Ressource score_format, die ein numerisches Argument akzeptiert, das durch den Platzhalter %d dargestellt wird. Übergeben Sie das LiveData-Objekt score als Argument für diesen Formatierungsstring.
<TextView
   android:id="@+id/score_text"
   ...
   android:text="@{@string/score_format(gameViewModel.score)}"
   ... />
  1. Entfernen Sie in der Klasse GameFragment in der Methode onCreateView() den Observer-Code score.

Zu entfernender Code:

viewModel.score.observe(this, Observer { newScore ->
   binding.scoreText.text = newScore.toString()
})
  1. Bereinigen Sie Ihre App, erstellen Sie sie neu und führen Sie sie aus. Spielen Sie dann das Spiel. Das aktuelle Wort und die Punktzahl werden auf dem Spielbildschirm formatiert.

Glückwunsch! Sie haben LiveData und ViewModel mit der Datenbindung in Ihre App integriert. Dadurch können die Ansichten in Ihrem Layout direkt mit ViewModel kommunizieren, ohne dass Klick-Handler im Fragment verwendet werden müssen. Sie haben auch LiveData-Objekte als Datenbindungsquelle verwendet, um die Benutzeroberfläche automatisch über Änderungen an den Daten zu informieren, ohne die LiveData-Beobachtermethoden.

Android Studio-Projekt: GuessTheWord

  • Die Data Binding Library funktioniert nahtlos mit Android-Architekturkomponenten wie ViewModel und LiveData.
  • Die Layouts in Ihrer App können an die Daten in den Architekturkomponenten gebunden werden. Diese helfen Ihnen bereits, den Lebenszyklus des UI-Controllers zu verwalten und über Änderungen an den Daten zu informieren.

ViewModel-Datenbindung

  • Sie können ein ViewModel mit einem Layout verknüpfen, indem Sie die Datenbindung verwenden.
  • ViewModel-Objekte enthalten die UI-Daten. Wenn Sie ViewModel-Objekte in die Datenbindung übergeben, können Sie einen Teil der Kommunikation zwischen den Ansichten und den ViewModel-Objekten automatisieren.

So verknüpfen Sie ein ViewModel mit einem Layout:

  • Fügen Sie der Layoutdatei eine Datenbindungsvariable vom Typ ViewModel hinzu.
   <data>

       <variable
           name="gameViewModel"
           type="com.example.android.guesstheword.screens.game.GameViewModel" />
   </data>
  • Übergeben Sie in der Datei GameFragment die GameViewModel an 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.
  • Mit Listener-Bindungen ersetzen Sie die Click-Listener in den UI-Controllern durch Listener-Bindungen in der Layoutdatei.
  • Durch die Datenbindung wird ein Listener erstellt und für die Ansicht festgelegt.
 android:onClick="@{() -> gameViewModel.onSkip()}"

LiveData zur Datenbindung hinzufügen

  • LiveData-Objekte können als Datenbindungsquelle verwendet werden, um die Benutzeroberfläche automatisch über Änderungen an den Daten zu informieren.
  • Sie können die Ansicht direkt an das LiveData-Objekt im ViewModel binden. Wenn sich die LiveData in der ViewModel ändert, können die Ansichten im Layout automatisch aktualisiert werden, ohne dass die Beobachtermethoden in den UI-Controllern erforderlich sind.
android:text="@{gameViewModel.word}"
  • Damit die LiveData-Datenbindung funktioniert, müssen Sie die aktuelle Aktivität (den UI-Controller) als Lifecycle-Inhaber der binding-Variablen im UI-Controller festlegen.
binding.lifecycleOwner = this

Stringformatierung mit Datenbindung

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

Udacity-Kurs:

Android-Entwicklerdokumentation:

In diesem Abschnitt werden mögliche Hausaufgaben für Schüler und Studenten aufgeführt, die dieses Codelab im Rahmen eines von einem Kursleiter geleiteten Kurses durcharbeiten. Es liegt in der Verantwortung des Kursleiters, Folgendes zu tun:

  • Weisen Sie bei Bedarf Aufgaben zu.
  • Teilen Sie den Schülern/Studenten mit, wie sie Hausaufgaben abgeben können.
  • Benoten Sie die Hausaufgaben.

Lehrkräfte können diese Vorschläge nach Belieben nutzen und auch andere Hausaufgaben zuweisen, die sie für angemessen halten.

Wenn Sie dieses Codelab selbst durcharbeiten, können Sie mit diesen Hausaufgaben Ihr Wissen testen.

Beantworten Sie diese Fragen

Frage 1

Welche der folgenden Aussagen über Listener-Bindungen ist nicht richtig?

  • 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 ähneln Methodenreferenzen, ermöglichen aber das Ausführen beliebiger Data-Binding-Ausdrücke.

Frage 2

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

Welche der folgenden Optionen ist die richtige Syntax zum Formatieren des Strings mit dem Data-Binding-Ausdruck?

  • 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 von LiveData gespeicherten Daten geändert werden
  • Wenn eine Aktivität aufgrund einer Konfigurationsänderung neu erstellt wird
  • Wenn ein Ereignis wie onClick() eintritt
  • Wenn die Aktivität in den Hintergrund verschoben wird

Nächste Lektion: 5.4: LiveData-Transformationen

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