Wie im letzten Blogeintrag zu Android berichtet, gibt es seit einiger Zeit (genau genommen seit dem erscheinen der Android 3.x Version für Tablets aka. Honeycomb aka. API Level 11) das Konzept der Fragments. Fragments scheinen neuerdings in vieler Entwickler-Munde zu sein, aber was sind Fragments eigentlich?
Was sind Fragments?
Einfach gesagt sind Fragments modulare Teile einer Activity. Mit dem Aufkommen von Tablets und der einhergehenden Vergrößerung der Bildschirmfläche können im Vergleich zum Smartphonebildschirm mehr Inhalte dargestellt werden. Somit sind auch mehr Möglichkeiten bei der Gestaltung der Benutzeroberfläche gegeben. War es zuweilen üblich bei Nutzerinteraktionen einfach die Activity zu wechseln oder einen überlagernden Dialog zu öffnen (und dadurch bestehende UI Elemente aus- und neue einzublenden), hat man mit mehr Bildschirmfläche auch zunehmend die Möglichkeit nicht alle Bestandteile seiner UI ausblenden zu müssen, sondern auch welche bestehen zu lassen. Beispielsweise eine Liste von Auswahlmöglichkeiten. Und gerade fuer dieses Szenario bietet Android mit den Fragments ein einfache Möglichkeit der Umsetzung.
Wie benutze ich Fragments?
Zuerst definieren wir uns ein Layout für das Fragment. Das geschieht wie gewohnt über XML Layout Dateien (man könnte auch programmatisch). Wollten wir beispielsweise einen Homescreen mit vier Buttons anlegen, könnte das Layout folgendermaßen aussehen.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center|center_vertical"
android:orientation="vertical" >
<Button
android:id="@+id/fragment_home_screen_button_start_in_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/fragment_home_screen_button_start_in_activity" />
<Button
android:id="@+id/fragment_home_screen_button_start_by_replacing"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/fragment_home_screen_button_start_by_replacing" />
<Button
android:id="@+id/fragment_home_screen_button_start_by_adding"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/fragment_home_screen_button_start_by_adding" />
<Button
android:id="@+id/fragment_home_screen_button_overlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/fragment_home_screen_button_overlay" />
</LinearLayout>Dieses können wir nun in ein wiederverwendbares Fragment packen, indem wir eine Klasse erstellen die von Fragment erbt und die onCreateView(LayoutInflater, ViewGroup, Bundle) überschreibt. Um das zuvor erstellte Layout anzuwenden, benutzen wir den übergebenen LayoutInflater und lassen ihn unser XML einlesen. Das wäre dann auch schon alles und könnte etwa wie folgt aussehen:
package de.brightsolutions.fragmentdemo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* some simplistic fragment example
*
* @author lavong.soysavanh
* @since 2012-01-23
*/
public class HomeScreenFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home_screen, container);
}
}Unser HomeScreenFragment ist nun bereit in Activities eingebunden zu werden. Es bietet sich wieder an das ganze auf dem sauberen xml Weg zu bewerkstelligen. Hierzu gibt es ein fragment-Tag, welches sich wie andere Komponenten verbauen lässt. Etwa so:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_home_screen_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/fragment_home_screen"
android:name="de.brightsolutions.fragmentdemo.HomeScreenFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>Wollten wir zwei Fragments nebeneinander platzieren, etwa im Querformat, dann sähe das mittels horizontalem LinearLayout so aus:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_home_screen_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<fragment
android:id="@+id/fragment_home_screen"
android:name="de.brightsolutions.fragmentdemo.HomeScreenFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/fragment_random_list"
android:name="de.brightsolutions.fragmentdemo.RandomListFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
</LinearLayout>
</FrameLayout>Angenommen man wollte nun Fragments programmatisch erzeugen und darstellen, dann ist dieses über den FragmentManager möglich. Dem übergeben wir eine Instanz unseres Fragments und lassen es ihn anzeigen.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(android.R.id.content, Fragment.instantiate(this, HomeScreenFragment.class.getName()));
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();Der Umgang mit Fragments ist doch eigentlich recht einfach. Im beiligendem Quelltext findet ihr noch einige Spielereien die ich mit Fragments unternommen habe. Da geht aber noch mehr. Viel Spass beim Ausprobieren!
| Anhang | Größe |
|---|---|
| FragmentDemo.zip | 478.63 KB |












Kommentar hinzufügen