Einführung in Android (2) 16. Dezember 2014 Überblick Entwicklung der Benutzeroberfläche Views Layouts Menüs Listen und Adapter Einbinden weiterer Ressourcen Aktivierung von Activities Entwicklungsrichtlinien Best Practices: generelle und spezielle Richtlinien für mobile Geräte Taentzer Einführung in die Softwaretechnik 283 Views Views: graphische Komponenten in einer Activity, z.B. Listen, Textfelder, Knöpfe und auch ein einbettbarer WebBrowser Definition der View-Hierarchie in der Layout-Datei der Activity View-Hierarchie: aus „android.com“ Taentzer Einführung in die Softwaretechnik 284 Zeichnen einer View Zeichnen einer View durch Aufruf von setContentView() der enthaltenden Activity Parameter: Wurzel der View-Hierarchie MainActivity.java: Verweis auf XML-Datei Taentzer Einführung in die Softwaretechnik 285 Layout-Gruppen Gruppieren mehrere Views zu einer ViewGroup. FrameLayout definiert einen leeren Rahmen, der später durch ein Objekt gefüllt werden kann. LinearLayout bringt alle Kinder in eine Reihe. TableLayout positioniert seine Kinder in Zeilen und Spalten. Die Tabelle wird durch eine Liste von TableRows aufgebaut. Einzelne Zellen können frei bleiben, aber nicht kombiniert werden. RelativeLayout überlässt seinen Kinder das Layout. Sie positionieren sich relativ zueinander (links, rechts, über, unter). Taentzer Einführung in die Softwaretechnik 286 Action Bar menu/main.xml: values/strings.xml: Taentzer Einführung in die Softwaretechnik 287 Aktivieren von Komponenten durch Intents Activities, Services und Broadcast Receivers werden durch asynchrone Nachrichten, sogenannte Intents, aktiviert. Start einer Activity: Intent erzeugen: Intent intent = new Intent(this, MyActivity.class) Mit putExtra() können Parameter mitgegeben werden. this – Kontextkomponente, von der der Intent erzeugt wird. MyActivity.class – Activity, die aktiviert werden soll Start der Activity: c.startActivity(intent) c - Kontextkomponente In der gestarteten Activity: getIntent() liefert den initialen Intent zurück. Back geht zur aufrufenden Activity zurück, kann durch onBackPressed() überschrieben werden Beenden einer Activity: selten explizit, da in andauernder Kommunikation mit dem Nutzer Taentzer Einführung in die Softwaretechnik 288 Callback-Methoden für Menüs Für Action Bars und Menüs: onCreateOptionsMenu() – Beim Erzeugen einer Activity wird das Menü aufgebaut. onPrepareOptionsMenu() – wird nach dem Drücken des MenuKnopfs aufgerufen onOptionsItemSelected() – wird bei Auswahl eines Menüeintrags aufgerufen und behandelt die möglichen Menüaktionen Für Kontext-Menüs: onCreateContextMenu() - wird zum Erzeugen eines Kontextmenüs aufgerufen onContextItemSelected() – wird bei Auswahl eines Menüeintrags aufgerufen und behandelt die möglichen Menüaktionen Taentzer Einführung in die Softwaretechnik 289 ListView als spezieller AdapterView Ein ListView ist eine ViewGroup zur Darstellung von Aufzählungen Die ListView ist ein AdapterView und braucht einen Adapter, um die Daten darzustellen. Ein AdapterView ist an eine externe Datenquelle gebunden. Zwischen der ListView und der Datenquelle fließt ein Adapter-Objekt. Mit einem spezialisierten Array Adapter kann die Darstellung der Listeneinträge angepasst werden. Taentzer Einführung in die Softwaretechnik 290 Beispiel: Erzeugen einer Liste ProduktActivity.java: Einlesen einer Liste aus einer Datei spezieller Listadapter zur Darstellung des Inhalts Taentzer Einführung in die Softwaretechnik 291 Beispiel: Ein angepasster ListAdapter Darzustellende Einträge Layout der Listeneinträge Context: umgebene Activity: ProduktActivity Taentzer Einführung in die Softwaretechnik 292 Beispiel: ein angepasster ListAdapter Zum Anzeigen von Listeneinträgen ProduktActivity.java: Taentzer Einführung in die Softwaretechnik 293 Darstellung von Bildern list_row.xml: Feste Bildgröße Feste Bildgröße ProduktActivity.java: Nur eine Bildressource Taentzer Einführung in die Softwaretechnik 294 Alternativ: Darstellung von Bildern drawable-* hält Bilder in verschiedenen Auflösungen. ProduktActivity.java: Taentzer Einführung in die Softwaretechnik 295 Entwicklungsrichtlinien für guten Code Generelle Best Practices: Vermeide doppelten Code! keine Copy-and-PasteProgrammierung Vermeide Spaghetti-Code! Vermeide temporäre Felder! keine Zwischenergebnisse in Objektfeldern Vermeide Klassen, die ihr Erbe verweigern! Alle geerbten Felder und Methoden sollen auch in den Unterklassen sinnvoll sein. Taentzer Spezielle Best Practices für mobile Anwendungen: Verlier keine Daten! Überschreibe onPause() und onResume(). Wenn die App wieder geöffnet wird, kehrt sie zum letzten Zustand zurück. Erzeuge nicht mehr Objekte als nötig! Nutze Netz und Strom wenig! Einführung in die Softwaretechnik 296 Entwicklungsrichtlinien für Benutzeroberflächen mobiler Geräte Teste Deine App auf einem realen Gerät. „Design for big fingers.“ Entwerfe für verschiedene, insbesondere horizontale und vertikale, Bildschirme. Vermeide zu viele Activities! Zeig nicht zu viele Informationen auf einem Bildschirm. Zeig nur das, was meistens benutzt wird. Alle anderen Informationen sollten zusätzlich anzeigbar sein. Taentzer Sei gefasst auf viele Unterbrechungen. „Scrolling is boring“: Überlege Dir eine kompakte Datenanzeige auf den Bildschirmseiten. Überlade Menüs nicht mit zu vielen Einträgen. Zeig nur die wichtigen Einträge und alle anderen unter „more“. „Back“ ist kein „cancel“, sondern „save“ und „quit“. Ein Click ist eine Aktion, meist ohne Bestätigung. Einführung in die Softwaretechnik 297 Zusammenfassung Activities enthalten Views. Layout in XML-Datei möglichst relatives Layout Activities aktivieren sich durch Intents. Listen und AdapterViews: Sind an Datenquellen angeschlossen Können Daten durch spezielle Adapter speziell darstellen. Entwicklungsrichtlinien generelle für guten Programmierstil spezielle für mobile Geräte: um Zeit und Platz zu sparen für eine gute Benutzeroberfläche Taentzer Einführung in die Softwaretechnik 298