Android Kotlin Fundamentals 06.3: LiveData mithilfe von LiveData steuern

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

  1. Fahren Sie mit dem eigenen Code am Ende des letzten Codelabs fort oder laden Sie den Startcode herunter.
  2. Prüfen Sie Ihren SleepQualityFragment-Startcode. Diese Klasse erhöht das Layout, ruft die Anwendung ab und gibt binding.root zurück.
  3. Öffnen Sie die Datei navigation.xml im Designeditor. Sie sehen, dass es einen Navigationspfad von SleepTrackerFragment nach SleepQualityFragment und noch einmal von SleepQualityFragment nach SleepTrackerFragment gibt.



  4. Überprüfen Sie den Code für die Datei navigation.xml. Suchen Sie insbesondere nach der <argument> mit dem Namen sleepNightKey.

    Wenn der Nutzer vom SleepTrackerFragment bis zum SleepQualityFragment, wechselt, übergibt die App eine Nacht an sleepNightKey an SleepQualityFragment, 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.

  1. Öffnen Sie SleepTrackerViewModel. Sie müssen eine Navigation hinzufügen, damit die App beim Antippen der Schaltfläche Beenden zu SleepQualityFragment gelangt, um eine Qualitätsbewertung zu erhalten.
  2. Erstelle in SleepTrackerViewModel einen LiveData, der sich ändert, wenn die App zu SleepQualityFragment wechseln soll. Verwende die Datenkapselung, um nur eine parsbare Version von LiveData für ViewModel 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
  1. Fügen Sie eine doneNavigating()-Funktion hinzu, mit der die Variable zurückgesetzt wird, die die Navigation auslöst.
fun doneNavigating() {
   _navigateToSleepQuality.value = null
}
  1. Lösen Sie im Klick-Handler für die Schaltfläche Stopp onStopTracking() die Navigation zu SleepQualityFragment aus. Legen Sie die Variable _navigateToSleepQuality am Ende der Funktion als letzte Sache innerhalb des Blocks launch{} fest. Diese Variable ist auf night festgelegt. Wenn diese Variable einen Wert hat, navigiert die App zum SleepQualityFragment und übergibt sie nachts.
_navigateToSleepQuality.value = oldNight
  1. Das SleepTrackerFragment muss _navigateToSleepQuality beobachten, damit die App weiß, wann sie navigieren muss. Fügen Sie in SleepTrackerFragment unter onCreateView() einen Beobachter für navigateToSleepQuality() hinzu. Beachten Sie, dass der Import dafür nicht eindeutig ist und Sie androidx.lifecycle.Observer importieren müssen.
sleepTrackerViewModel.navigateToSleepQuality.observe(this, Observer {
})

  1. 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 Sie androidx.navigation.fragment.findNavController.
night ->
night?.let {
   this.findNavController().navigate(
           SleepTrackerFragmentDirections
                   .actionSleepTrackerFragmentToSleepQualityFragment(night.nightId))
   sleepTrackerViewModel.doneNavigating()
}
  1. 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

  1. Erstellen oder öffnen Sie im Paket sleepquality die Datei SleepqualityViewModel.kt.
  2. Erstelle eine SleepQualityViewModel-Klasse, die einen sleepNightKey und eine Datenbank als Argumente verwendet. Genau wie beim SleepTrackerViewModel müssen Sie auch die database vom Werk übernehmen. Sie müssen auch sleepNightKey aus dem Navigationsbereich übernehmen.
class SleepQualityViewModel(
       private val sleepNightKey: Long = 0L,
       val database: SleepDatabaseDao) : ViewModel() {
}
  1. Definieren Sie in der Klasse SleepQualityViewModel eine Job und eine uiScope und überschreiben Sie onCleared().
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)

override fun onCleared() {
   super.onCleared()
   viewModelJob.cancel()
}
  1. Deklarieren Sie _navigateToSleepTracker, um mit demselben Muster wie oben zum Artikel SleepTrackerFragment zurückzukehren. navigateToSleepTracker und doneNavigating() implementieren
private val _navigateToSleepTracker = MutableLiveData<Boolean?>()

val navigateToSleepTracker: LiveData<Boolean?>
   get() = _navigateToSleepTracker

fun doneNavigating() {
   _navigateToSleepTracker.value = null
}
  1. 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 mit sleepNightKey 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
        }
    }
  1. Erstellen oder öffnen Sie im Paket sleepquality SleepQualityViewModelFactory.kt und fügen Sie die Klasse SleepQualityViewModelFactory 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

  1. Öffnen Sie SleepQualityFragment.kt.
  2. Nachdem du onCreateView() application erhalten hast, brauchst du den arguments, der mit der Navigation geliefert wurde. Diese Argumente sind in SleepQualityFragmentArgs. Du musst sie aus dem Set extrahieren.
val arguments = SleepQualityFragmentArgs.fromBundle(arguments!!)
  1. Rufen Sie als Nächstes die dataSource ab.
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
  1. Erstelle eine Fabrik und übergib die dataSource und sleepNightKey.
val viewModelFactory = SleepQualityViewModelFactory(arguments.sleepNightKey, dataSource)
  1. Rufen Sie eine ViewModel-Referenz ab.
val sleepQualityViewModel =
       ViewModelProviders.of(
               this, viewModelFactory).get(SleepQualityViewModel::class.java)
  1. 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
  1. 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

  1. Öffne die fragment_sleep_quality.xml-Layoutdatei. Fügen Sie im <data>-Block eine Variable für SleepQualityViewModel hinzu.
 <data>
       <variable
           name="sleepQualityViewModel"
           type="com.example.android.trackmysleepquality.sleepquality.SleepQualityViewModel" />
   </data>
  1. 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)}"
  1. 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.

  1. Öffne die fragment_sleep_tracker.xml-Layoutdatei.
  2. Füge jeder Schaltfläche die Property android:enabled hinzu. Die Property android: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}"
  1. Ö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 Wert null hat.
  • Die Schaltfläche Stop muss aktiviert sein, wenn tonight nicht null 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()
}
  1. 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.

  1. Erstellen Sie in der SleepTrackerViewModel das eingeschlossene Ereignis.
private var _showSnackbarEvent = MutableLiveData<Boolean>()

val showSnackBarEvent: LiveData<Boolean>
   get() = _showSnackbarEvent
  1. Implementieren Sie anschließend doneShowingSnackbar().
fun doneShowingSnackbar() {
   _showSnackbarEvent.value = false
}
  1. Fügen Sie in SleepTrackerFragment in onCreateView() einen Beobachter hinzu:
sleepTrackerViewModel.showSnackBarEvent.observe(this, Observer { })
  1. 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()
   }
  1. Lösen Sie in SleepTrackerViewModel das Ereignis in der Methode onClear() aus. Setzen Sie dazu den Ereigniswert auf true innerhalb des launch-Blocks:
_showSnackbarEvent.value = true
  1. 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 eine ViewModelFactory 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 in TextView definiert und für alle Unterklassen übernommen, einschließlich Button.
  • Das Attribut android:enabled bestimmt, ob ein View aktiviert ist. Die Bedeutung von „Aktiviert“ kann nach Unterklasse variieren. Bei einem nicht aktivierten EditText kann der Nutzer beispielsweise den enthaltenen Text nicht bearbeiten. Bei einem nicht aktivierten Button kann der Nutzer nicht auf die Schaltfläche tippen.
  • Das enabled-Attribut ist nicht dasselbe wie das visibility-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 Wert LiveData (gotoBlueFragment).
  • Beobachten Sie in RedFragment den Wert gotoBlueFragment. Implementiere den observe{}-Code, um gegebenenfalls zu BlueFragment zu gelangen, und setze dann den Wert von gotoBlueFragment 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 von RedFragment bis BlueFragment wechseln muss.
  • Achten Sie darauf, dass Ihr Code einen onClickHandler für den ViewHandler definiert, den der Nutzer durch Klicken zum BlueFragment aufruft, wo der onClick-Handler den Wert goToBlueFragmentbeobachtet.

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 eine LiveData-Variable, myNumber, die die Zahl darstellt. Definieren Sie außerdem eine Variable, deren Wert durch Aufrufen von Transform.map() für die Variable myNumber 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 Datei ViewModel den folgenden Code hinzu:
val myNumber: LiveData<Int>

val enableUpdateNumberButton = Transformations.map(myNumber) {
   myNumber > 5
}
  • Lege im XML-Layout das Attribut android:enabled des update_number_button button auf NumberViewModel.enableUpdateNumbersButton fest.
android:enabled="@{NumbersViewModel.enableUpdateNumberButton}"
  • Fügen Sie in der Fragment-Klasse, die die NumbersViewModel-Klasse verwendet, einen Beobachter zum enabled-Attribut der Schaltfläche hinzu.

    Fügen Sie insbesondere in der Datei Fragment 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 von update_number_button button auf "Observable" fest.

Weiter zur nächsten Lektion: 7.1 RecyclerView-Grundlagen

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