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 einemViewModel
. - 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 integrierenLiveData
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 anViewModel
-Objekte, sodass die Ansichten direkt mit denViewModel
-Objekten kommunizieren. - Sie ändern die App so, dass
LiveData
als Datenbindungsquelle verwendet wird. Nach dieser Änderung benachrichtigen dieLiveData
-Objekte die Benutzeroberfläche über Änderungen an den Daten. DieLiveData
-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.
- (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.
- Führen Sie die App aus und spielen Sie das Spiel.
- 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.
- 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
alsButton
-Ansicht definiert. - Wenn der Nutzer auf die Schaltfläche Got It (Okay) tippt, ruft ein Klick-Listener im
GameFragment
-Fragment den entsprechenden Klick-Listener inGameViewModel
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
.
- Fügen Sie in der Datei
game_fragment.xml
eine Datenbindungsvariable vom TypGameViewModel
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...
- Übergeben Sie in der Datei
GameFragment
dieGameViewModel
an die Datenbindung.
Weisen Sie dazuviewModel
der Variablenbinding.gameViewModel
zu, die Sie im vorherigen Schritt deklariert haben. Fügen Sie diesen Code inonCreateView()
ein, nachdemviewModel
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.
- Fügen Sie in
game_fragment.xml
das AttributonClick
zumskip_button
hinzu. Definieren Sie einen Bindungsausdruck und rufen Sie die MethodeonSkip()
inGameViewModel
auf. Dieser Bindungsausdruck wird als Listener-Bindung bezeichnet.
<Button
android:id="@+id/skip_button"
...
android:onClick="@{() -> gameViewModel.onSkip()}"
... />
- Binden Sie das Click-Ereignis des
correct_button
-Elements an dieonCorrect
()
-Methode imGameViewModel
.
<Button
android:id="@+id/correct_button"
...
android:onClick="@{() -> gameViewModel.onCorrect()}"
... />
- Binde das Klickereignis von
end_game_button
an die MethodeonGameFinish
()
imGameViewModel
.
<Button
android:id="@+id/end_game_button"
...
android:onClick="@{() -> gameViewModel.onGameFinish()}"
... />
- 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
.
- Fügen Sie in der Datei
score_fragment.xml
eine Bindungsvariable vom TypScoreViewModel
hinzu. Dieser Schritt ähnelt dem, was Sie oben fürGameViewModel
getan haben.
<layout ...>
<data>
<variable
name="scoreViewModel"
type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
- Fügen Sie in
score_fragment.xml
das AttributonClick
zumplay_again_button
hinzu. Definieren Sie eine Listener-Bindung und rufen Sie die MethodeonPlayAgain()
in derScoreViewModel
auf.
<Button
android:id="@+id/play_again_button"
...
android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
... />
- Initialisieren Sie in
ScoreFragment
innerhalb vononCreateView()
dieviewModel
. Initialisieren Sie dann die Bindungsvariablebinding.scoreViewModel
.
viewModel = ...
binding.scoreViewModel = viewModel
- Entfernen Sie in
ScoreFragment
den Code, mit dem der Klick-Listener fürplayAgainButton
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() }
- 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 inScoreFragment
.
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:
- 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. - 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. - 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
.
- Fügen Sie in
game_fragment.xml
das Attributandroid:text
zur Textansichtword_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.
- Legen Sie in der
GameFragment
inonCreateView()
nach der Initialisierung dergameViewModel
die aktuelle Aktivität als Lifecycle-Inhaber derbinding
-Variablen fest. Dadurch wird der Umfang desLiveData
-Objekts oben definiert. Das Objekt kann die Ansichten im Layoutgame_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
- Entfernen Sie in
GameFragment
den Observer fürLiveData
word
.
Zu entfernender Code:
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
- 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.
- Fügen Sie in
score_fragment.xml
das Attributandroid:text
zur Textansicht der Punktzahl hinzu. Weisen SiescoreViewModel.score
dem Attributtext
zu. Dascore
eine Ganzzahl ist, muss sie mitString.valueOf()
in einen String umgewandelt werden.
<TextView
android:id="@+id/score_text"
...
android:text="@{String.valueOf(scoreViewModel.score)}"
... />
- Legen Sie in
ScoreFragment
nach der Initialisierung vonscoreViewModel
die aktuelle Aktivität als Lifecycle-Inhaber der Variablenbinding
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
- Entfernen Sie in
ScoreFragment
den Observer für dasscore
-Objekt.
Zu entfernender Code:
// Add observer for score
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- 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.
- Fügen Sie in
string.xml
die folgenden Strings hinzu, die Sie zum Formatieren der Textansichtenword
undscore
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>
- Aktualisieren Sie in
game_fragment.xml
das Attributtext
der Textansichtword_text
, damit die String-Ressourcequote_format
verwendet wird. Übergeben Sie einen Wert fürgameViewModel.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)}"
... />
- Formatieren Sie die Textansicht
score
ähnlich wieword_text
. Fügen Sie imgame_fragment.xml
das Attributtext
zur Textansichtscore_text
hinzu. Verwenden Sie die String-Ressourcescore_format
, die ein numerisches Argument akzeptiert, das durch den Platzhalter%d
dargestellt wird. Übergeben Sie dasLiveData
-Objektscore
als Argument für diesen Formatierungsstring.
<TextView
android:id="@+id/score_text"
...
android:text="@{@string/score_format(gameViewModel.score)}"
... />
- Entfernen Sie in der Klasse
GameFragment
in der MethodeonCreateView()
den Observer-Codescore
.
Zu entfernender Code:
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- 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
undLiveData
. - 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 SieViewModel
-Objekte in die Datenbindung übergeben, können Sie einen Teil der Kommunikation zwischen den Ansichten und denViewModel
-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
dieGameViewModel
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 imViewModel
binden. Wenn sich dieLiveData
in derViewModel
ä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 derbinding
-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 dasLiveData
-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:
Links zu anderen Codelabs in diesem Kurs finden Sie auf der Landingpage für Android Kotlin Fundamentals-Codelabs.