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 einemViewModel
. - 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 anViewModel
-Objekte, sodass die Ansichten direkt mit denViewModel
-Objekten kommunizieren. - Sie ändern die Anwendung so, dass
LiveData
als Datenbindungsquelle verwendet wird. Nach der Änderung werden die Änderungen über die Daten von denLiveData
-Objekten an die UI gesendet und dieLiveData
-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.
- 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.
- Führe die App aus und spiel das Spiel.
- 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.
- 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
alsButton
-Ansicht definiert. - Wenn der Nutzer auf die Schaltfläche Ok tippt, wird ein Klick-Listener im
GameFragment
-Fragment den entsprechenden Klick-Listener inGameViewModel
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
.
- 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
Datenbindung an die Datenbindung.
Dazu weisen Sie der im vorherigen Schritt deklarierten VariableviewModel
binding.gameViewModel
zu. 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 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
.
- Fügen Sie in
game_fragment.xml
das AttributonClick
demskip_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()}"
... />
- Ebenso binden Sie das Klickereignis des
correct_button
an die MethodeonCorrect
()
inGameViewModel
.
<Button
android:id="@+id/correct_button"
...
android:onClick="@{() -> gameViewModel.onCorrect()}"
... />
- Verknüpfe das Klickereignis des
end_game_button
mit der MethodeonGameFinish
()
inGameViewModel
.
<Button
android:id="@+id/end_game_button"
...
android:onClick="@{() -> gameViewModel.onGameFinish()}"
... />
- 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
.
- Fügen Sie in der Datei
score_fragment.xml
eine Bindungsvariable vom TypScoreViewModel
hinzu. Dieser Schritt ähnelt den Schritten, die Sie beiGameViewModel
oben ausgeführt 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
demplay_again_button
hinzu. Definieren Sie eine Listener-Bindung und rufen Sie die MethodeonPlayAgain()
inScoreViewModel
auf.
<Button
android:id="@+id/play_again_button"
...
android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
... />
- Initialisiere in
ScoreFragment
innerhalb vononCreateView()
dieviewModel
. Initialisieren Sie dann die Bindungsvariablebinding.scoreViewModel
.
viewModel = ...
binding.scoreViewModel = viewModel
- Entfernen Sie in
ScoreFragment
den Code, der den Klick-Listener für dieplayAgainButton
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() }
- 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 inScoreFragment
.
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:
- 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. - 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. - 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
.
- Fügen Sie in
game_fragment.xml
der Textansicht inword_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.
- Legen Sie in
GameFragment
nach der Initialisierung vongameViewModel
inonCreateView()
die aktuelle Aktivität als Lebenszyklusinhaber der Variablenbinding
fest. Definiert den Bereich des oben stehendenLiveData
-Objekts. Dadurch kann das Objekt 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 Beobachter fürLiveData
word
.
Zu entfernender Code:
/** Setting up LiveData observation relationship **/
viewModel.word.observe(this, Observer { newWord ->
binding.wordText.text = newWord
})
- 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.
- Fügen Sie in
score_fragment.xml
der Ansicht „Text“ den Wertandroid:text
hinzu. Weisen Sie dem Attributtext
den WertscoreViewModel.score
zu. Da es sich beiscore
um eine Ganzzahl handelt, konvertieren Sie sie mithilfe vonString.valueOf()
in einen String.
<TextView
android:id="@+id/score_text"
...
android:text="@{String.valueOf(scoreViewModel.score)}"
... />
- Legen Sie in
ScoreFragment
nach dem Initialisieren derscoreViewModel
die aktuelle Aktivität als Lebenszyklusinhaber der Variablebinding
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
- Entferne 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ü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).
- Füge in
string.xml
die folgenden Strings hinzu, mit denen du die Textansichtenword
undscore
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>
- Aktualisieren Sie in
game_fragment.xml
das Attributtext
der Textansicht inword_text
, um die String-Ressourcequote_format
zu verwenden. Pass ingameViewModel.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
score
-Textansicht ähnlich wie bei derword_text
. Fügen Sie in dergame_fragment.xml
das Attributtext
zur Textansicht inscore_text
hinzu. Verwenden Sie die String-Ressourcescore_format
, die ein numerisches Argument verwendet, das durch den Platzhalter%d
dargestellt wird. Übergeben Sie dasLiveData
-Objektscore
als Argument an diesen Formatierungsstring.
<TextView
android:id="@+id/score_text"
...
android:text="@{@string/score_format(gameViewModel.score)}"
... />
- Entfernen Sie in der Klasse
GameFragment
in deronCreateView()
-Methode den Observer-Codescore
.
Zu entfernender Code:
viewModel.score.observe(this, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
- 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
undLiveData
. - 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 vonViewModel
-Objekten in die Datenbindung können Sie einen Teil der Kommunikation zwischen den Ansichten und denViewModel
-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
denGameViewModel
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
inViewModel
binden. Wenn sichLiveData
inViewModel
ä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 Variablebinding
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 dastext
-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:
Links zu anderen Codelabs in diesem Kurs finden Sie auf der Landingpage zu Kotlin-Grundlagen für Android.