Android-UI-Fragmente

Flexibles UI-Design

Lars Röwekamp
Qual der Wahl – Teil II

Selektiert der Nutzer ein Element aus der Liste, springt die Anwendung in die Callback-Methode onListItemClick(…) und ruft von dort showDetails(position) für das eben selektierte Element auf. Ein Blick in diese Methode zeigt, dass mittels if-Abfrage zwischen der Dual-Pane- und der Single-Pane-Anzeige unterschieden wird. Die Berechnung des Booleschen Wertes erfolgt dabei durch einen Zugriff auf die umliegende Activity und den Test, ob dieses das Detail-Fragment beinhaltet und anzeigt:

View rssDetails = getActivity().findViewById(R.id.rss_detail);
boolean isDualPane = rssDetails!= null &&
                         rssDetails.getVisibility() == View.VISIBLE;

Befindet sich die Anwendung im Dual-Pane-Modus, können also beide Fragmente gleichzeitig angezeigt werden, wird in der Methode showDetails(position) ein neues RSSDetailsFragment mit dem Inhalt des ausgewählten RSS-Feed-Elements erzeugt und anschließend in die umliegende Activity eingefügt. Für das dynamische Einfügen eines Fragments in eine Activity verwenden wir eine FragmentTransaction. Mithilfe der Transaktion wird sichergestellt, dass mehrere Manipulationen auf Fragmenten zu einer atomaren Operation zusammengefasst werden:

RSSDetailsFragment details = RSSDetailsFragment.newInstance(index);
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.rss_detail, details);
    ft.commit();

Befindet sich die Anwendung dagegen nicht im Dual-Pane- sondern im Single-Pane-Modus und muss somit die Anzeige des RSSDetailsFragment in einer eigenen Activity erfolgen, wird wie sonst auch üblich ein Intent erzeugt, das für den Aufruf bzw. das Starten der Activity verantwortlich ist. Welches RSS-Feed-Element in der Activity beziehungsweise dem darin enthaltenen Fragment angezeigt werden soll, wird dem Intent als Parameter, also als „Extra“, mitgegeben.

Intent intent = new Intent();
intent.setClass(getActivity(), RSSDetailsActivity.class);
intent.putExtra("index", index);
startActivity(intent);

Schauen wir uns nun auch noch einmal die Klasse RSSDetailsFragment etwas genauer an (Listing 2). Um zu demonstrieren, wie ein Fragment auch ohne XML-Layout zur Laufzeit aufgebaut werden kann, basiert RSSDetailsFragment, im Gegensatz zur Klasse RSSListFragment, nicht auf einem vordefinierten Layout, sondern baut die UI dynamisch auf. In der Callback-Methode onCreateView(…) wird zunächst ein Scroller erzeugt und in diesen dann ein TextView-Element platziert, das zur Anzeige des Feed-Textes dient. Die so erzeugte View wird von der Methode zurückgegeben und kann nun automatisch in die umliegende Activity eingebettet werden. Wir erinnern uns, dass die umliegende Activity je nach Ausrichtung des Geräts entweder die RSSActivity (Landscape) oder aber die RSSDetailsActivity (Portrait) sein kann.

Menüs und Action Bar

Im Verlauf des Artikels haben wir bereits einige Parallelen zwischen Fragmenten und Activities kennengelernt. So verwundert es nicht, dass auch im Bereich des Menu Handlings adaptierte Konzepte zu finden sind. Genau wie eine Activity kann auch ein Fragment mithilfe der Callback-Methode onCreateOptionMenu() einzelne Menüpunkte zu einem bestehenden Menü – oder einem Action Bar – hinzufügen. Damit diese Methode überhaupt aufgerufen wird, muss allerdings innerhalb der onCreate()-Methode des Fragments ein entsprechendes Interesse durch den Aufruf von setHasOptionMenu() signalisiert werden.

Stellen mehrere Fragmente einzelne Menüpunkte zur Verfügung, setzt sich das Gesamtmenü am Ende aus dem Activity-Menü und den einzelnen Fragment-Menüs zusammen. Bei der Abarbeitung eines selektierten Menüeintrags hat dabei zunächst die Activity Vorrang. Nur wenn das Event nicht von der Activity verarbeitet wird, kommt das Fragment zum Zug. Natürlich lässt sich neben dem beschriebenen Option-Menü auch ein Kontextmenü in einem Fragment registrieren.

Fazit

Durch die Einführung der UI-Fragmente in Android 3.0 für Tablet-PCs und deren allgemeine Verfügbarkeit in Android 4.0 haben die Möglichkeiten des UI-Designs deutlich an Flexibilität gewonnen. User Interfaces können modular aufgebaut, einzelne UI-Bestandteile in verschiedenen Activities wiederverwendet werden. UI-Workflows können sich zur Laufzeit – mit wenigen Zeilen zusätzlichen Codes – optimal an die verschiedenen Ziel-Devices anpassen. Natürlich bringt die Verwendung der neuen UI-Fragmente auch ein gewisses Umdenken für UI-Designer und Entwickler mit sich. Da die Android-UI-Fragmente aber von Anfang an als embeddable Komponenten konzipiert und stark an die bereits bestehenden Activities angepasst wurden, ist der Einstieg relativ einfach. Last but not least bleibt zu erwähnen, dass dank Googles „Android Compability Package“ [3] das Konzept der Fragmente auch in Android Apps abwärts bis zur Version 1.6 zur Anwendung kommen kann.

Lars Röwekamp ist Geschäftsführer der open knowledge GmbH und berät seit mehr als zehn Jahren Kunden in internationalen Projekten rund um das Thema Enterprise Computing (Twitter: @mobileLarson).
Geschrieben von
Lars Röwekamp
Kommentare

Schreibe einen Kommentar

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