Posts mit dem Label SharedPreferences werden angezeigt. Alle Posts anzeigen
Posts mit dem Label SharedPreferences werden angezeigt. Alle Posts anzeigen

18. Juni 2014

In eigener Sache: Android-Library "AndroidSeekBarPreference"

Gemäß den Design-Richtlinien des mobilen Betriebssystems "Android" werden die Einstellungen einer App als sogenannte "Preferenes" angeboten. Die Android-API, die für die Entwicklung von Apps zur Verfügung steht, bietet eine Reihe solcher Preferences, wie beispielsweise solche zur benutzerdefinierten Eingabe mittels Textfelder oder zur Auswahl eines Wertes aus einer vorgegebenen Liste, an. Eine Preference zur Auswahl eines Zahlenwertes aus einem kontinuierlichen Zahlenbereich mittels eines Schiebereglers, einer sogenannten SeekBar fehlt der API jedoch. Die Android-Library "AndroidSeekBarPreference" schließt diese Lücke, indem sie die Implementierung einer solchen Funktionalität, einschließlich vielseitiger Konfigurationsmöglichkeiten anbietet. Eine Preference, die mit Hilfe der Library umgesetzt wurde, erlaubt es, wie es durch den unten stehenden Screenshot verdeutlicht wird, einen Auswahldialog zu öffnen mit dessen Hilfe es möglich ist, einen Fließkommawert oder einen ganzzahligen Wert aus einem vorgegebenen Wertebereich zu wählen. Der ausgewählte Wert wird dabei erst übernommen, wenn der Benutzer die Auswahl bestätigt. Daneben besteht auch die Möglichkeit, den Dialog zu beenden, ohne die getätigte Änderung zu übernehmen.

Das Erscheinungsbild einer Preference der Library "AndroidSeekBarPreference" (Klicken zum Vergrößern)

Die Library unterstützt dabei die folgenden Funktionen:
  • Erlaubt es, einen Fließkommawert oder einen ganzzahligen Wert aus einem kontinuierlichen Wertebereich mittels einer SeekBar zu wählen.
  • Die Anzahl der Dezimalstellen der Fließkommawerte, die durch die Preference ausgewählt werden können sollen, kann vorgegeben werden. Wenn die Anzahl der Dezimalstellen auf 0 gesetzt wird, können stattdessen nur ganzzahlige Werte ausgewählt werden.
  • Der Wertebereich, bzw. der minimale und maximale Wert, kann frei gewählt werden. 
  • Der Dialog, der dem Benutzer zur Auswahl des Wertes angezeigt wird, kann eine frei wählbare Nachricht beinhalten.
  • Der ausgewählte Wert wird erst übernommen, wenn der Benutzer die Auswahl bestätigt. Daneben besteht auch die Möglichkeit, den Dialog zu beenden, ohne die getätigte Änderung zu übernehmen.
  • Es ist möglich, eine Schrittweite zu definieren. Wenn die SeekBar von dem Benutzer bewegt wird, wird der aktuelle Wert um diese Schrittweise erhöht, bzw. erniedrigt.
  • Die Anzeige des aktuell gewählten Wertes kann dahingehend konfiguriert werden, dass eine Einheit definiert werden kann, die zur Ausgabe an den eigentlichen Wert angehängt wird und dass das Symbol, das zur Trennung von Fließkommazahlen genutzt wird, frei gewählt werden kann.
  • Die Unterschrift der Preference kann abhängig von dem aktuell ausgewählten Wert gewählt werden. Alternativ kann auch der gewählte Wert selbst angezeigt werden.
  • Das Erscheinungsbild der Preference entspricht dem der, von der Android-API bereits angebotenen, Preferences.
Die Library kann über diese Projektseite auf Sourceforge bezogen werden. Der Quellcode wird unter der GLPL 3-Lizenz veröffentlicht und steht über ein Mercurial-Repository bereit. Unter diesem Link finden sich die JUnit-Tests der Library und unter diesem Link wird eine Beispielanwendung angeboten, die zu Präsentationszwecken Gebrauch von der Library macht.

Weiterführende Links:


19. April 2013

Android: Erkennen wenn App zum ersten Mal gestartet wird

Manchmal kann es bei der Entwicklung einer Android-App hilfreich sein, erkennen zu können wenn diese nach ihrer Installation zum ersten Mal gestartet wird. Diese Erkennung kann man dann beispielsweise nutzen um die Datenbank mit standardmäßigen Einträgen zu füllen oder dem User hilfreiche Tipps einzublenden. Im Folgenden soll kurz aufgezeigt werden, wie so etwas erreicht werden kann.

Die Erkennung sollte in der Activity stattfinden, die beim Starten der App als Erste angezeigt wird. Für die Umsetzung genügt folgender Code:
 public class StartActivity extends Activity {  
   
   SharedPreferences sharedPreferences;  
   
   @Override  
   public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     sharedPreferences = getSharedPreferences("preferenceName", MODE_PRIVATE);  
   }  
   
   @Override  
   public void onResume() {  
     super.onResume();  
   
     if (sharedPreferences.getBoolean("firstrun", true)) {  
       sharedPreferences.edit().putBoolean("firstrun", false).commit();  
       // Hier Code einfügen der beim ersten Start einmalig ausgeführt werden soll  
     }  
   }  
   
 }  
Der Code basiert auf der Verwendung von SharedPreferences, die es erlauben, primitive Datentypen zu speichern und zu erhalten, selbst wenn die App beendet wird. In der onCreate-Methode wird zunächst eine solche SharedPreferences-Instanz über einen Namen instanziiert. In der onResume-Methode, die dem Activity-Lifecycle nach erst nach der onCreate-Methode aufgerufen wird, wird versucht einen boolschen Wert mit dem Key "firstrun" aus den SharedPreferences zu laden. Für den Fall, dass dies nicht gelingt, also genau dann, wenn die App zum ersten Mal gestartet wird, wird der Default-Wert "true" angegeben. In diesem Fall wird der Code innerhalb der if-Bedingung ausgeführt, wo nun der Boolean-Wert mit dem Key "firstrun" auf "false" gesetzt werden muss, so dass bei den folgenden Durchläufen die if-Bedingung nie wieder erfüllt wird. Außerdem kann an dieser Stelle derjenige Code eingefügt werden, der beim ersten Start der App ausgeführt werden soll.