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 diesem Codelab wird noch einmal zusammengefasst, wie du ViewModel
und Fragmente gemeinsam zur Navigation nutzen kannst. Denk daran, dass das Ziel darin besteht, logisch in die Datei ViewModel
zu gehen, aber die Pfade in den Fragmenten und der Navigationsdatei zu definieren. Dazu verwenden Sie Ansichtsmodelle, Fragmente, LiveData
und Betrachter.
Am Ende des Codelabs wird eine intelligente Möglichkeit angezeigt, wie du Schaltflächenstatus mit minimalem Code nachverfolgen kannst. Das heißt, dass jede Schaltfläche aktiviert und anklickbar ist, wenn es für den Nutzer sinnvoll ist, auf diese Schaltfläche zu tippen.
Was Sie bereits wissen sollten
Sie sollten mit Folgendem vertraut sein:
- Erstellen einer einfachen Benutzeroberfläche mit einer Aktivität, Fragmenten und Ansichten
- Die Navigation zwischen den Fragmenten und die Verwendung von
safeArgs
zum Übergeben von Daten zwischen Fragmenten. - Modelle ansehen, Modellfabriken, Transformationen und
LiveData
und ihre Betrachter ansehen. - Eine
Room
-Datenbank erstellen, ein Datenzugriffsobjekt (DAO) erstellen und Entitäten definieren. - Koroutinen für Datenbankinteraktionen und andere lang andauernde Aufgaben verwenden
Lerninhalte
- So aktualisieren Sie einen vorhandenen Datensatz für die Schlafqualität in der Datenbank.
LiveData
verwenden.- Anzeige einer Snackbar als Reaktion auf ein Ereignis
Aufgaben
- Erweitern Sie die TrackMySleepQualitäts-App, um eine Qualitätsbewertung zu erhalten, die Bewertung in die Datenbank aufzunehmen und das Ergebnis anzuzeigen.
- Mit
LiveData
wird die Anzeige einer Snackbar ausgelöst. - Mit
LiveData
können Sie Schaltflächen aktivieren und deaktivieren.
In diesem Codelab kannst du die Schlafqualitäts-App und die finale Benutzeroberfläche der TrackMySleepQualitäts-App erstellen.
Die App hat zwei Bildschirme, die durch Fragmente dargestellt werden, wie in der folgenden Abbildung dargestellt.
Auf dem ersten Bildschirm auf der linken Seite finden Sie Schaltflächen zum Starten und Beenden der Aufzeichnung. Auf dem Bildschirm werden alle Schlafdaten des Nutzers angezeigt. Mit der Schaltfläche Löschen werden alle Daten gelöscht, die die App für den Nutzer erfasst hat.
Auf dem zweiten Bildschirm rechts wird die Qualität des Schlafs angezeigt. In der App wird die Bewertung in numerischer Form dargestellt. Zu Entwicklungszwecken zeigt die App sowohl die Gesichtssymbole als auch ihre numerischen Entsprechungen an.
Der Ablauf für Nutzer sieht so aus:
- Der Nutzer öffnet die App und sieht den Schlaftracking-Bildschirm.
- Der Nutzer tippt auf die Schaltfläche Starten. Damit wird die Startzeit aufgezeichnet und angezeigt. Die Schaltfläche Starten ist deaktiviert und die Schaltfläche Beenden ist aktiviert.
- Der Nutzer tippt auf die Schaltfläche Beenden. Damit wird die Endzeit erfasst und der Bildschirm für die Schlafqualität geöffnet.
- Der Nutzer wählt ein Symbol für die Schlafqualität aus. Der Bildschirm wird geschlossen und der Tracking-Bildschirm zeigt die Schlafzeit und die Schlafqualität an. Die Schaltfläche Stopp ist deaktiviert und die Schaltfläche Starten ist aktiviert. Die App ist bereit für eine weitere Nacht.
- Die Schaltfläche Löschen ist immer dann verfügbar, wenn Daten in der Datenbank vorhanden sind. Wenn der Nutzer auf Löschen tippt, werden alle seine Daten gelöscht. Es wird keine Meldung angezeigt.
Für diese App wird eine vereinfachte Architektur verwendet, die im Folgenden im Kontext der vollständigen Architektur gezeigt wird. Die Anwendung verwendet nur die folgenden Komponenten:
- UI-Controller
- Modell und
LiveData
ansehen - Eine Raumdatenbank
In diesem Codelab wird davon ausgegangen, dass du weißt, wie die Navigation mithilfe von Fragmenten und der Navigationsdatei implementiert wird. Um Ihre Arbeit zu sparen, wird Ihnen ein Großteil dieses Codes zur Verfügung gestellt.
Schritt 1: Code prüfen
- Fahren Sie mit dem eigenen Code am Ende des letzten Codelabs fort oder laden Sie den Startcode herunter.
- Prüfen Sie Ihren
SleepQualityFragment
-Startcode. Diese Klasse erhöht das Layout, ruft die Anwendung ab und gibtbinding.root
zurück. - Öffnen Sie die Datei navigation.xml im Designeditor. Sie sehen, dass es einen Navigationspfad von
SleepTrackerFragment
nachSleepQualityFragment
und noch einmal vonSleepQualityFragment
nachSleepTrackerFragment
gibt. - Überprüfen Sie den Code für die Datei navigation.xml. Suchen Sie insbesondere nach der
<argument>
mit dem NamensleepNightKey
.
Wenn der Nutzer vomSleepTrackerFragment
bis zumSleepQualityFragment,
wechselt, übergibt die App eine Nacht ansleepNightKey
anSleepQualityFragment
, die aktualisiert werden muss.
Schritt 2: Navigation für Schlafqualität hinzufügen
Das Navigationsdiagramm enthält bereits die Pfade vom SleepTrackerFragment
zum SleepQualityFragment
und zurück. Die Klick-Handler, die die Navigation von einem Fragment zum nächsten implementieren, sind jedoch noch nicht codiert. Sie fügen diesen Code jetzt in der ViewModel
hinzu.
Im Klick-Handler legen Sie einen LiveData
fest, der sich ändert, wenn die App zu einem anderen Ziel navigieren soll. Das Fragment beobachtet diese LiveData
. Wenn sich die Daten ändern, ruft das Fragment das Ziel auf und weist das Ansichtsmodell an, dass es abgeschlossen ist, wodurch die Statusvariable zurückgesetzt wird.
- Öffnen Sie
SleepTrackerViewModel
. Sie müssen eine Navigation hinzufügen, damit die App beim Antippen der Schaltfläche Beenden zuSleepQualityFragment
gelangt, um eine Qualitätsbewertung zu erhalten. - Erstelle in
SleepTrackerViewModel
einenLiveData
, der sich ändert, wenn die App zuSleepQualityFragment
wechseln soll. Verwende die Datenkapselung, um nur eine parsbare Version vonLiveData
fürViewModel
verfügbar zu machen.
Sie können diesen Code an beliebiger Stelle auf der obersten Ebene des Kurstexts platzieren.
private val _navigateToSleepQuality = MutableLiveData<SleepNight>()
val navigateToSleepQuality: LiveData<SleepNight>
get() = _navigateToSleepQuality
- Fügen Sie eine
doneNavigating()
-Funktion hinzu, mit der die Variable zurückgesetzt wird, die die Navigation auslöst.
fun doneNavigating() {
_navigateToSleepQuality.value = null
}
- Lösen Sie im Klick-Handler für die Schaltfläche Stopp
onStopTracking()
die Navigation zuSleepQualityFragment
aus. Legen Sie die Variable _navigateToSleepQuality
am Ende der Funktion als letzte Sache innerhalb des Blockslaunch{}
fest. Diese Variable ist aufnight
festgelegt. Wenn diese Variable einen Wert hat, navigiert die App zumSleepQualityFragment
und übergibt sie nachts.
_navigateToSleepQuality.value = oldNight
- Das
SleepTrackerFragment
muss _navigateToSleepQuality
beobachten, damit die App weiß, wann sie navigieren muss. Fügen Sie inSleepTrackerFragment
unteronCreateView()
einen Beobachter fürnavigateToSleepQuality()
hinzu. Beachten Sie, dass der Import dafür nicht eindeutig ist und Sieandroidx.lifecycle.Observer
importieren müssen.
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})
- Gehen Sie im Beobachterblock zu der ID der aktuellen Nacht und rufen Sie sie auf. Rufen Sie dann
doneNavigating()
auf. Wenn Ihr Import unklar ist, importieren Sieandroidx.navigation.fragment.findNavController
.
night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
sleepTrackerViewModel.doneNavigating()
}
- Erstelle deine App und führe sie aus. Tippe auf Start und dann auf Stopp, um zum
SleepQualityFragment
-Bildschirm zu gelangen. Um zurückzugehen, verwenden Sie die Zurück-Taste des Systems.
Bei dieser Aufgabe zeichnet du die Schlafqualität auf und kehrst zum Tracker des Schlaftrackers zurück. Das Display sollte automatisch aktualisiert werden, um dem Nutzer den aktualisierten Wert anzuzeigen. Du musst ViewModel
und ViewModelFactory
erstellen und SleepQualityFragment
aktualisieren.
Schritt 1: ViewModel und ViewViewFactory erstellen
- Erstellen oder öffnen Sie im Paket
sleepquality
die Datei SleepqualityViewModel.kt. - Erstelle eine
SleepQualityViewModel
-Klasse, die einensleepNightKey
und eine Datenbank als Argumente verwendet. Genau wie beimSleepTrackerViewModel
müssen Sie auch diedatabase
vom Werk übernehmen. Sie müssen auchsleepNightKey
aus dem Navigationsbereich übernehmen.
class SleepQualityViewModel(
private val sleepNightKey: Long = 0L,
val database: SleepDatabaseDao) : ViewModel() {
}
- Definieren Sie in der Klasse
SleepQualityViewModel
eineJob
und eineuiScope
und überschreiben SieonCleared()
.
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}
- Deklarieren Sie
_navigateToSleepTracker
, um mit demselben Muster wie oben zum ArtikelSleepTrackerFragment
zurückzukehren.navigateToSleepTracker
unddoneNavigating()
implementieren
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()
val navigateToSleepTracker: LiveData<Boolean?>
get() = _navigateToSleepTracker
fun doneNavigating() {
_navigateToSleepTracker.value = null
}
- Erstellen Sie einen Klick-Handler,
onSetSleepQuality()
, für alle Bilder in der Schlafqualität, die verwendet werden sollen.
Verwende dasselbe Koroutine-Muster wie im vorherigen Codelab:
- Starten Sie eine Koroutine im
uiScope
und wechseln Sie zum I/O-Trafficker. tonight
mitsleepNightKey
herunterladen.- Wähle die Schlafqualität aus.
- Aktualisieren Sie die Datenbank.
- Navigation auslösen
Im folgenden Codebeispiel wird die gesamte Arbeit im Klick-Handler ausgeführt, anstatt den Datenbankvorgang im anderen Kontext zu berücksichtigen.
fun onSetSleepQuality(quality: Int) {
uiScope.launch {
// IO is a thread pool for running operations that access the disk, such as
// our Room database.
withContext(Dispatchers.IO) {
val tonight = database.get(sleepNightKey) ?: return@withContext
tonight.sleepQuality = quality
database.update(tonight)
}
// Setting this state variable to true will alert the observer and trigger navigation.
_navigateToSleepTracker.value = true
}
}
- Erstellen oder öffnen Sie im Paket
sleepquality
SleepQualityViewModelFactory.kt
und fügen Sie die KlasseSleepQualityViewModelFactory
hinzu, wie unten dargestellt. In dieser Klasse wird eine Version des gleichen Boilerplate-Codes verwendet, den du bereits gesehen hast. Prüfen Sie den Code, bevor Sie fortfahren.
class SleepQualityViewModelFactory(
private val sleepNightKey: Long,
private val dataSource: SleepDatabaseDao) : ViewModelProvider.Factory {
@Suppress("unchecked_cast")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(SleepQualityViewModel::class.java)) {
return SleepQualityViewModel(sleepNightKey, dataSource) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
Schritt 2: Sleep QualityFragment aktualisieren
- Öffnen Sie
SleepQualityFragment.kt
. - Nachdem du
onCreateView()
application
erhalten hast, brauchst du denarguments
, der mit der Navigation geliefert wurde. Diese Argumente sind inSleepQualityFragmentArgs
. Du musst sie aus dem Set extrahieren.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
- Rufen Sie als Nächstes die
dataSource
ab.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
- Erstelle eine Fabrik und übergib die
dataSource
undsleepNightKey
.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
- Rufen Sie eine
ViewModel
-Referenz ab.
val sleepQualityViewModel =
ViewModelProviders.of(
this, viewModelFactory).get(SleepQualityViewModel::class.java)
- Fügen Sie dem Bindungsobjekt
ViewModel
hinzu. Wenn Sie eine Fehlermeldung mit dem Bindungsobjekt sehen, können Sie sie vorübergehend ignorieren.
binding.sleepQualityViewModel = sleepQualityViewModel
- Fügen Sie den Beobachter hinzu. Importieren Sie den
androidx.lifecycle.Observer
, wenn Sie dazu aufgefordert werden.
sleepQualityViewModel.navigateToSleepTracker.observe(this, Observer {
if (it == true) { // Observed state is true.
this.findNavController().navigate(
SleepQualityFragmentDirections.actionSleepQualityFragmentToSleepTrackerFragment())
sleepQualityViewModel.doneNavigating()
}
})
Schritt 3: Layoutdatei aktualisieren und App ausführen
- Öffne die
fragment_sleep_quality.xml
-Layoutdatei. Fügen Sie im<data>
-Block eine Variable fürSleepQualityViewModel
hinzu.
<data>
<variable
name="sleepQualityViewModel"
type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
</data>
- Fügen Sie für jedes der sechs Bilder mit Schlafqualität einen Klick-Handler wie den folgenden hinzu. Ordnen Sie die Qualität dem Bild zu.
android:onClick="@{() -> sleepQualityViewModel.onSetSleepQuality(5)}"
- Bereinigung und Neuerstellung Ihres Projekts. Damit sollten alle Fehler mit dem Bindungsobjekt behoben werden. Andernfalls leeren Sie den Cache (Datei > Caches entwerten / Neu starten) und erstellen Sie die App neu.
Glückwunsch! Sie haben gerade eine vollständige Room
-Datenbank-App mit Koroutinen erstellt.
Deine App funktioniert nun hervorragend. Der Nutzer kann beliebig oft auf Starten und Beenden tippen. Wenn der Nutzer auf Stopp tippt, kann er eine Schlafqualität erreichen. Wenn der Nutzer auf Löschen tippt, werden alle Daten im Hintergrund gelöscht. Allerdings sind alle Schaltflächen immer aktiviert und anklickbar. Dadurch wird die App nicht gestört, Nutzer können jedoch unvollständige Schlafabende erstellen.
In dieser letzten Aufgabe lernen Sie, wie Sie mithilfe von Transformationskarten die Sichtbarkeit der Schaltfläche verwalten, sodass Nutzer nur die richtige Auswahl treffen. Sie können eine ähnliche Methode verwenden, um eine freundliche Mitteilung anzuzeigen, nachdem alle Daten gelöscht wurden.
Schritt 1: Schaltflächen aktualisieren
Ziel ist es, den Schaltflächenstatus so einzustellen, dass anfangs nur die Schaltfläche Start aktiviert ist, sodass sie auch angeklickt werden kann.
Sobald der Nutzer auf Starten tippt, wird die Schaltfläche Stopp aktiviert und Starten nicht. Die Schaltfläche Löschen wird nur aktiviert, wenn sich Daten in der Datenbank befinden.
- Öffne die
fragment_sleep_tracker.xml
-Layoutdatei. - Füge jeder Schaltfläche die Property
android:enabled
hinzu. Die Propertyandroid:enabled
ist ein boolescher Wert, der angibt, ob die Schaltfläche aktiviert ist. Aktivierte Schaltflächen werden aktiviert oder aktiviert. Geben Sie der Property den Wert einer Statusvariablen, die Sie in einem Moment definieren.
start_button
:
android:enabled="@{sleepTrackerViewModel.startButtonVisible}"
stop_button
:
android:enabled="@{sleepTrackerViewModel.stopButtonVisible}"
clear_button
:
android:enabled="@{sleepTrackerViewModel.clearButtonVisible}"
- Öffnen Sie
SleepTrackerViewModel
und erstellen Sie drei entsprechende Variablen. Weisen Sie jeder Variable eine Transformation zu, die sie testet.
- Die Schaltfläche Starten sollte aktiviert sein, wenn
tonight
den Wertnull
hat. - Die Schaltfläche Stop muss aktiviert sein, wenn
tonight
nichtnull
ist. - Die Schaltfläche Löschen sollte nur aktiviert werden, wenn
nights
und daher in der Datenbank Schlafnächte enthalten.
val startButtonVisible = Transformations.map(tonight) {
it == null
}
val stopButtonVisible = Transformations.map(tonight) {
it != null
}
val clearButtonVisible = Transformations.map(nights) {
it?.isNotEmpty()
}
- Führen Sie Ihre App aus und experimentieren Sie mit den Schaltflächen.
Schritt 2: Nutzer über eine Snackbar informieren
Nachdem der Nutzer die Datenbank gelöscht hat, soll ihm eine Bestätigung über das Snackbar
-Widget angezeigt werden. Über eine Snackbar erhalten Sie über eine Nachricht unten auf dem Bildschirm kurzes Feedback zu einer Operation. Eine Snackbar verschwindet nach einer Zeitüberschreitung, nach einer Nutzerinteraktion an einer anderen Stelle auf dem Bildschirm oder nachdem der Nutzer die Snackbar über den Bildschirm wischt.
Die Snackbar ist eine UI-Aufgabe, die im Fragment erfolgen sollte. Ob die Snackbar eingeblendet wird, geschieht in ViewModel
. Wenn Sie eine Snackbar einrichten und auslösen möchten, wenn die Daten gelöscht sind, können Sie das gleiche Verfahren wie zum Auslösen der Navigation verwenden.
- Erstellen Sie in der
SleepTrackerViewModel
das eingeschlossene Ereignis.
private var _showSnackbarEvent = MutableLiveData<Boolean>()
val showSnackBarEvent: LiveData<Boolean>
get() = _showSnackbarEvent
- Implementieren Sie anschließend
doneShowingSnackbar()
.
fun doneShowingSnackbar() {
_showSnackbarEvent.value = false
}
- Fügen Sie in
SleepTrackerFragment
inonCreateView()
einen Beobachter hinzu:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })
- Rufen Sie im Observerblock die Snackbar auf und setzen Sie das Ereignis sofort zurück.
if (it == true) { // Observed state is true.
Snackbar.make(
activity!!.findViewById(android.R.id.content),
getString(R.string.cleared_message),
Snackbar.LENGTH_SHORT // How long to display the message.
).show()
sleepTrackerViewModel.doneShowingSnackbar()
}
- Lösen Sie in
SleepTrackerViewModel
das Ereignis in der MethodeonClear()
aus. Setzen Sie dazu den Ereigniswert auftrue
innerhalb deslaunch
-Blocks:
_showSnackbarEvent.value = true
- Erstelle deine App und führe sie aus.
Android Studio-Projekt: TrackMySleepqualityFinal
Die Implementierung von Schlafqualität in dieser App ist wie das Abspielen von vertrauter Musik in einem neuen Schlüssel. Das hat sich nicht geändert. Das zugrunde liegende Muster dessen, was Sie in den vorherigen Codelabs in dieser Lektion gelernt haben, bleibt unverändert. Auf diese Muster sollte man sich bei der Codierung verlassen, da Sie Code aus bestehenden Apps wiederverwenden können. Hier sind einige der Muster, die in diesem Kurs bisher verwendet wurden:
- Erstellen Sie eine
ViewModel
und eineViewModelFactory
und richten Sie eine Datenquelle ein. - Navigation auslösen Setze zum Trennen der Probleme den Klick-Handler im Ansichtsmodell und die Navigation im Fragment.
- Verwende die Datenkapselung mit
LiveData
, um Statusänderungen zu verfolgen und darauf zu reagieren. - Verwende Transformationen mit
LiveData
. - Erstellen Sie eine Singleton-Datenbank.
- Koroutinen für Datenbankvorgänge einrichten.
Auslösende Navigation
Sie definieren mögliche Navigationspfade zwischen Fragmenten in einer Navigationsdatei. Es gibt verschiedene Möglichkeiten, um von einem Fragment zum nächsten zu navigieren. Verfügbare Ausrichtungsmethoden:
- Definiere
onClick
-Handler, um die Navigation zu einem Zielfragment auszulösen. - So aktivierst du die Navigation von einem Fragment zum nächsten:
- Definieren Sie einen
LiveData
-Wert für die Aufzeichnung, wenn eine Navigation erfolgen soll. - Fügen Sie diesem
LiveData
-Wert einen Beobachter hinzu. - Der Code wird dann immer dann geändert, wenn die Navigation ausgelöst oder abgeschlossen werden muss.
Attribut „android:enabled“ festlegen
- Das Attribut
android:enabled
ist inTextView
definiert und für alle Unterklassen übernommen, einschließlichButton
. - Das Attribut
android:enabled
bestimmt, ob einView
aktiviert ist. Die Bedeutung von „Aktiviert“ kann nach Unterklasse variieren. Bei einem nicht aktiviertenEditText
kann der Nutzer beispielsweise den enthaltenen Text nicht bearbeiten. Bei einem nicht aktiviertenButton
kann der Nutzer nicht auf die Schaltfläche tippen. - Das
enabled
-Attribut ist nicht dasselbe wie dasvisibility
-Attribut. - Sie können Transformationszuordnungen verwenden, um den Wert des
enabled
-Attributs der Schaltflächen auf der Grundlage des Status eines anderen Objekts oder einer anderen Variable festzulegen.
Weitere Punkte, die in diesem Codelab behandelt werden:
- Zum Senden von Benachrichtigungen an den Nutzer können Sie dasselbe Verfahren wie für die Navigation verwenden.
- Du kannst den Nutzer mit einem
Snackbar
benachrichtigen.
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
Eine Möglichkeit, die App zum Aufrufen der Navigation von einem Fragment zum nächsten zu bewegen, besteht darin, mit einem LiveData
-Wert festzulegen, ob die Navigation ausgelöst werden soll.
Welche Schritte sind erforderlich, um den Wert LiveData
namens gotoBlueFragment
zu verwenden, um die Navigation vom roten Fragment zum blauen Fragment auszulösen? Wähle alle zutreffenden Optionen aus.
- Definieren Sie in der Spalte
ViewModel
den WertLiveData
(gotoBlueFragment
). - Beobachten Sie in
RedFragment
den WertgotoBlueFragment
. Implementiere denobserve{}
-Code, um gegebenenfalls zuBlueFragment
zu gelangen, und setze dann den Wert vongotoBlueFragment
zurück, um anzugeben, dass die Navigation abgeschlossen ist. - Achte darauf, dass dein Code die Variable
gotoBlueFragment
auf den Wert setzt, der die Navigation auslöst, wenn die App vonRedFragment
bisBlueFragment
wechseln muss. - Achten Sie darauf, dass Ihr Code einen
onClick
Handler für denView
Handler definiert, den der Nutzer durch Klicken zumBlueFragment
aufruft, wo deronClick
-Handler den WertgoToBlueFragment
beobachtet.
Frage 2
Mithilfe von LiveData
können Sie ändern, ob Button
aktiviert oder anklickbar ist. Wie würdest du sicherstellen, dass deine App die Schaltfläche UpdateNumber
so ändert, dass Folgendes geschieht:
- Die Schaltfläche ist aktiviert, wenn
myNumber
einen Wert größer als 5 hat. - Die Schaltfläche ist nicht aktiviert, wenn
myNumber
gleich oder kleiner als 5 ist.
Angenommen, das Layout, das die Schaltfläche UpdateNumber
enthält, enthält die Variable <data>
für NumbersViewModel
, wie hier gezeigt:
<data> <variable name="NumbersViewModel" type="com.example.android.numbersapp.NumbersViewModel" /> </data>
Angenommen, die ID der Schaltfläche in der Layoutdatei sieht folgendermaßen aus:
android:id="@+id/update_number_button"
Was sollten Sie noch tun? Wählen Sie alle zutreffenden Antworten aus.
- Definieren Sie in der Klasse
NumbersViewModel
eineLiveData
-Variable,myNumber
, die die Zahl darstellt. Definieren Sie außerdem eine Variable, deren Wert durch Aufrufen vonTransform.map()
für die VariablemyNumber
festgelegt wird. Diese gibt einen booleschen Wert zurück, der angibt, ob die Zahl größer als 5 ist.
Fügen Sie insbesondere in der DateiViewModel
den folgenden Code hinzu:
val myNumber: LiveData<Int>
val enableUpdateNumberButton = Transformations.map(myNumber) {
myNumber > 5
}
- Lege im XML-Layout das Attribut
android:enabled
desupdate_number_button button
aufNumberViewModel.enableUpdateNumbersButton
fest.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
- Fügen Sie in der
Fragment
-Klasse, die dieNumbersViewModel
-Klasse verwendet, einen Beobachter zumenabled
-Attribut der Schaltfläche hinzu.
Fügen Sie insbesondere in der DateiFragment
den folgenden Code hinzu:
// Observer for the enabled attribute
viewModel.enabled.observe(this, Observer<Boolean> { isEnabled ->
myNumber > 5
})
- Lege in der Layoutdatei das Attribut
android:enabled
vonupdate_number_button button
auf"Observable"
fest.
Weiter zur nächsten Lektion:
Links zu anderen Codelabs in diesem Kurs finden Sie auf der Landingpage zu Kotlin-Grundlagen für Android.