Android-UI-Fragmente

Flexibles UI-Design

Lars Röwekamp

Das Android SDK ist vom visuellen Konzept her so ausgerichtet, dass Softwareentwickler ihre mobilen Anwendungen für verschiedenste Bildschirmgrößen und -auflösungen auf Basis derselben Sourcen umsetzen können. So weit, so gut. Doch was ist, wenn völlig unterschiedliche Device-Typen wie Smartphones, Tablet-PCs oder TVs und deren spezifische Eigenschaften unterstützt werden sollen? Auch hier gibt es seit Android 3.0 beziehungsweise 4.0 eine Lösung: UI-Fragmente.

Dass ein Betriebssystem wie Android mittelfristig nur dann Erfolg haben wird, wenn es der zu erwartenden Fragmentierung am Markt Herr werden kann, war von Anfang an allen klar. Entsprechend früh flossen Konzepte wie Layout-Manager und Multi-Screen-Konfiguration – zur Berücksichtigung unterschiedlicher Bildschirmgröße und -auflösung – in das Android SDK ein und gehören mittlerweile zum kleinen Einmaleins eines jeden Android-Entwicklers. Problematischer wird es allerdings, wenn die bestmögliche User Experience nicht nur von einer an den Bildschirm angepassten Ressource oder einem optimal skalierten Bild abhängt. Spätestens seit der Einführung von Android-basierten Tablet-PCs und TVs schreit die bisherige Design-Philosophie „one design fits all“ nach einer Überarbeitung. Diese existiert seit der Version 3.0 für Tablet-PCs und seit 4.0 nun auch für alle anderen Android Devices in Form von UI-Fragmenten.

Weniger ist mehr

Was genau muss man sich unter einem Fragment vorstellen? Ein Fragment ist laut Android-SDK-Dokumentation eine Art Activity-Modul mit (optional) eigener UI und eigenem Lifecycle. Es ist somit mehr als eine klassische UI-Komponente wie der Button und weniger als eine Activity. Die Grundidee der Fragmente ist, dass man je nach Capabilities des Ziel-Device eines oder mehrere von ihnen innerhalb einer Activity einbinden und so dynamisch eine Multi-Pane UI aufbauen kann. Während man zum Beispiel für einen klassischen Master Detail Use Case auf einem Tablet-PC links eine Liste von Elementen, Fragment A, und rechts die Details des gerade selektierten Elements, Fragment B, anzeigen kann, würde man dies auf einem Smartphone auf zwei verschiedene Screens verteilen (Abb. 1).

Abb. 1: Möglichkeiten zur Einbindung der Fragmente A und B je nach Ziel-Device

Im Grunde genommen kann man sich ein Fragment also wie eine Art Mini- oder Sub-Activity vorstellen. Es besitzt zwar einen eigenen Lifecycle und ein eigenes Event Handling, benötigt aber immer eine umliegende Activity, in dessen Lifecycle es sich integriert. Pausiert eine Activity, pausieren auch alle enthaltenen Fragmente. Wird eine Activity zerstört, werden auch alle zugehörigen Fragmente zerstört. Abbildung 2 zeigt den Lifecycle des Fragments in Abhängigkeit vom Activity State.

Abb. 2: Fragment-Lifecycle
Wo bleibt der Use Case?

Ein Fragment wird zwar grundsätzlich eingebettet in eine Activity verwendet, kann aber durchaus in verschiedenen Activities wiederverwendet werden. Ebenfalls ist es möglich, Fragmente zur Laufzeit zu manipulieren, sie also zu einer Activity hinzuzufügen oder aus dieser zu entfernen, um so zur Laufzeit dynamisch eine gerätespezifische Multi-Pane UI aufzubauen. Im Rahmen einer solchen Fragment-Transaktion lassen sich die Fragmente auch auf einen Back Stack legen, wo sie von der Activity verwaltet und vom Anwender mittels BACK-Button wieder hervorgeholt werden können. Das Konzept der Fragmente wurde bewusst stark an die bereits bekannten Activities angelehnt, erweitert diese aber gleich um eine ganze Reihe von Features, um so ein flexibles UI-Design zu ermöglichen:

  • Fragmente sind per Definition als embeddable UI-Komponenten konzipiert und haben entsprechende Schnittstellen zur Kommunikation der umliegenden Activity.
  • Fragmente binden sich optimal in den Lifecycle der umgegeben Activity ein und ergänzen diesen durch ihren eigenen Lifecycle.
  • Der State eines Fragments wird automatisch vom Framework gemeinsam mit dem State der umliegenden Activity verwaltet.
  • Ein spezielles DialogFragment erlaubt die Darstellung eines Dialogs, der von der umliegenden Activity gesteuert werden kann.
  • Ein spezielles ListFragment ermöglicht die einfache Umsetzung von Master-Detail-Beziehungen.

Tipp: Bei der Konzeption eines Fragments sollte man immer die potenzielle Wiederverwendung im Hinterkopf behalten und einen entsprechend modularen Aufbau planen.

Geschrieben von
Lars Röwekamp
Kommentare
  1. Holger2014-04-05 10:08:45

    Schöner Artikel, ich habe sogar das Heft, nur die CD nicht mehr. Gibt's den Code irgendwo zum Herunterladen?

  2. Redaktion JAXenter2014-04-09 05:53:30

    Hallo Holger,

    eine CD zum Heft gab es damals leider nicht - die Quellcodes gibts also nur im Artikel. Allerdings sind die Listings hier tatsächlich nicht komplett - wir werden das umgehend reparieren!

    Vielen Dank für den Hinweis!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.