Android Tutorial StateManager: Hilfe zur Verwaltung der Android Einstellungen und Zustände

klaus

Expert
Licensed User
StateManager ist ein Codemodul das sich um die Handlung der UI (User Interface) Zustände und Einstellungen kümmert.

Einstellungen
Einstellungen sind im Programm einstellbare Parameter. Diese Einstellungen sollten permanent erhalten werden.

Die Methoden zur Behandlung der Einstellungen sind sehr einfach:
StateManager.GetSetting (Key As String) As String: gibt die Werte zurück die mit dem gegebenen Schlüsselwort verbunden sind. Ein leerer String wird zurück gegeben wenn das Schlüsselwort (Key) nicht zur Verfügung steht. Die Einstellungen werden von einer Datei geladen wenn sie vorher nicht schon geladen wurden.

StateManager.GetSetting2 (Key As String, DefaultValue As String) As String: Ähnlich wie GetSetting. Die Default-Werte werden zurück gegeben falls das Schlüsselwort nicht gefunden wurde.

StateManager.SetSetting(Key As String, Value As String): Verbindet die gegebenen Werte mit den gegebenen Schlüsselworten. Beachten Sie, dass es nicht nötig ist SaveSettings nach jedem SetSetting aufzurufen.

StateManager.SaveSettings: Speichert die Einstellungen in eine Datei. Normalerweise wird diese Methode in Activity_Pause aufrufen.

UI State
Der UI state (Userer Interface state) 'Benutzerschnittstelle Zustand' ist etwas interessanter. In manchen Fällen wird Android die aktuelle Activity zerstören und, wenn nötig, neu erstellen. Das kommt vor wenn der Benutzer, zum Beispiel, die Bildschirmorientierung ändert. Falls der Benutzer einen Text in eine EditText eingegeben hat wollen wir dass dieser beibehalten wird. Also anstatt dass wir das UI neu erstellen, speichern wir dessen Zustand und holen ihn dann wieder zurück.

Nicht Alle Elemente werden gespeichert. Nur die Elemente die der Benutzer genutzt hat (EditText Texte, Spinner gewählter Eintrag, SeekBar Wert...).
Die Benutzung von StateManager macht die Behandlung des UI-Zustandes einfach:

B4X:
Sub Activity_Resume
    If StateManager.RestoreState(Activity, "Main", 60) = False Then
        'set the default values
        EditText1.Text = "Default text"
        EditText2.Text = "Default text"
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If UserClosed Then
        StateManager.ResetState("Main")
    Else
        StateManager.SaveState(Activity, "Main")
    End If
    StateManager.SaveSettings
End Sub
Wenn die Activity geschlossen (paused) wird, testen wir ob der Benutzer sie geschlossen hat (Druck auf die Back-Taste). In diesem Fall wird der Zustand zurück gesetzt. Der Stringparameter ist der Name der Activity. StateManager kann den Zustand von mehreren Activities verwalten, deshalb wird der Name zur Unterscheidung der Activities benutzt.
Wenn UserClosed=False ist, dann speichern wir den Zustand.
Die Einstellungen in beiden Fällen gespeichert.

Wenn die Activity erneuert wird (resumes) rufen wir StateManager.RestoreState auf. Der letzte Parameter ist Gültigkeitsperiode für diesen Zustand. Der Zustand wird nicht geladen wenn mehr als die vorgegeben Minuten verlaufen sind. '0' eingeben für eine unbestimmte Zeitspanne.
RestoreState gibt einen boolschen Wert zurück. True wenn der Zustand geladen wurde. Wenn der Zustand nicht geladen wurde ist Ihre Verantwortung die Defaultwerte zu setzen. Das ist der Fall wenn der Benutzer das Programm das erste mal startet.

Um StateManager zu benutzen muss man im Menü 'Project - Add Existing Module' wählen und die StateManager.bas Datei einfügen, diese ist im beigelegten Beispiel inbegriffen. Sie müssen auch die RandomAccessFile Library referenzieren (im IDE ankreuzen).

statemanager_1.png



Beiliegende Dateien:

zip.gif
StateManager.zip
 

Jost aus Soest

Active Member
Licensed User
Hallo Klaus,

ich wollte auch gerade so ein Modul schreiben, habe aber noch gerade rechtzeitig deinen Code gefunden - vielen Dank dafür! :)

Mir ist allerdings aufgefallen, dass du die Rückgabetypen nicht definiert hast. Hat das einen speziellen Grund, den ich momentan einfach nicht erkennen kann? :confused:

Hier übrigens zum Vergleich meine Version:
B4X:
Sub Process_Globals
   Dim constSettingsFileName As String: constSettingsFileName = "settings.properties"
   Dim SettingsMap As Map
End Sub

Sub GetSetting(Key As String, DefaultValue As String) As String
   InitSettings
   Return SettingsMap.GetDefault(Key.ToLowerCase, DefaultValue)
End Sub

Sub SetSetting(Key As String, Value As String) As String
   InitSettings
   SettingsMap.Put(Key.ToLowerCase, Value)
End Sub

Sub SaveSettings
   If SettingsMap.IsInitialized _
   Then File.WriteMap(File.DirInternal, constSettingsFileName, SettingsMap)
End Sub

Sub InitSettings
   If SettingsMap.IsInitialized Then Return
   If File.Exists(File.DirInternal, constSettingsFileName) Then 
      SettingsMap = File.ReadMap(File.DirInternal, constSettingsFileName)
   Else
      SettingsMap.Initialize
   End If
End Sub
(GetSetting ohne Default brauchte ich nicht.)
 
Top