23
Android - Fragmente 28.08.2012

Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Embed Size (px)

Citation preview

Page 1: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Android - Fragmente

28.08.2012

Page 2: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Definition• Verhalten oder Teil der Benutzeroberfläche einer Activity.• Mehrere Fragmente können in einer Activity zu einer aufgeteilten UI

kombiniert werden.• Fragmente können in verschiedenen Activities wiederverwendet werden.• Ein Fragment könnte als Sub-Activity bezeichnet werden:

– Sie ist ein eigenständiger Teil in der Activity – Hat einen eigenen Lebenszyklus– Hat eigene Input-Events zugeordnet– Kann während der Laufzeit einer Activity hinzugefügt oder entfernt werden

Page 3: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Definition• Ein Fragment muss immer in eine Activity integriert sein, und ist auch vom

Lebenszyklus der Activity direkt abhängig/betroffen.• Während der Laufzeit eine Activity kann das Fragment

aktivitätsunabhängig manipuliert werden (z.B. add/remove).• Wenn eine solche Transaktion ausgeführt wird, kann diese auf den back-

Stack der Activity gelegt werden. So können, wie bei Activities, auch Transaktionen auf Fragmente Rückgängig gemacht werden.

Page 4: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Definition• Wenn ein Fragment als Element des Layouts der Activity hinzugefügt wird,

wird dieses in einer ViewGroup in der Activity gespeichtert, das Fragment definiert sein eigenes Layout.

• Ein Fragment kann einer Activity hinzugefügt werden indem man im Activity-Layout ein <fragment>-Element definiert oder es programmatisch einer existierenden ViewGroup zuordnet.

• Ein Fragment muss nicht Teil des Layouts der Activity sein, ein Fragment kann auch ohne Oberfläche als „unsichtbarer Arbeiter“ in der Activity verwendet werden.

Page 5: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Design Philosophy• Android hat Fragmente in der Version 3.0 eingeführt• Es sollen dynamische Oberflächen, vor allem auf größeren Bildschirmen –

Tablets, verbessert dargestellt werden können.• Fragmente erlauben ein solches Design ohne dass komplexe Änderungen

an der „view hierarchy“ der Activity vorgenommen werden müssen.• Indem man das Layout der Activity in Fragmente unterteilt, erhält man die

Möglichkeit das Aussehen der Activity während der Laufzeit zu verändern (inkl. Back-Stack).

• Jedes Fragment sollte als modulare und wiederverwendbare Komponente entworfen werden. (siehe Beispiel)

Page 6: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Design Philosophy

• Hier sieht man zwei unabhängig voneinander entworfene Fragmente: A und B.Auf dem Tablet ist es nun möglich beide Fragmente in einer Activity aufzurufen und gleichzeitig nebeneinander anzuzeigen. Auf dem Smartphone fehl dazu der Platz, so können nun die beiden Fragmente von unterschiedlichen Activities genutzt und aufgerufen werden.

Page 7: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating a Fragment• Um ein Fragment zu erzeugen muss man eine Sub-Klasse von Fragment erzeugen.• Die Klasse Fragment ist der Klasse Activity sehr ähnlich.• In der Klasse Fragment sind Callback-Methoden ähnlich denen der Activity

vorhenden – onCreate(), onStart(), onPause(), onStop().

• Normalerweiße sollten mindesten die folgenden drei Methoden im Fragment implementiert sein:

1. onCreate()– Aufruf bei erstellen der Fragments – initallisieren von Elementen die behalten werden

sollen bis das Fragment zerstört wird.

2. onCreateView()– Aufruf beim ersten zeichnen – Zurückliefern einer View die das Grundgerüst für das

Fragment stellt (null – wenn das Fragment keine UI bereitstellen soll).

3. onPause()– Aufruf beim verlassen des Fragments – hier können Änderungen gespeichert werden die

persistent gesichert werden sollen.

Page 8: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating a Fragment• Es gibt fertig implementierte Sub-Klassen der Klasse Fragment für

unterschiedliche Zwecke:

1. DialogFragment– Stellt einen „schwebenden“ Dialog dar. Gute Alternative zum DialogHelper

der Activity-Klasse weil das DialogFragment auf den back-Stack der Activity gelegt werden kann.

2. ListFragment– Stellt eine von einem Adapter gemanagte Liste dar (gleich wie ListActivity).

3. PreferenceFragment– Stellt eine Liste von Preferences dar (gleich wie PreferenceActivity). Nützlich

wenn eine „Settings“-Activity für eine Anwendung erstellt werden soll.

Page 9: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Lifecycle

Page 10: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Adding a UI• Ein Fragment wird normal als Teil des UI der Activity genutzt.• Um dem Fragment ein Layout hinzuzufügen muss die onCreateView()-

Methode überschrieben werden, diese Methode muss nach der Implementierung eine View zurückliefern.

• Um eine Layout/eine View aus der Methode zurückzuliefern beinhaltet die Methode ein Inflater Objekt, dieses kann eine XML-Datei aus einen Recource-Ordner als UI zeichnen.

• Der Inflater wird innerhalb der onCreateView() aufgerufen.

Page 11: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Adding a UI• Bsp.

public static class ExampleFragment extends Fragment { @Override public View onCreateView(

LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

// Inflate the layout for this fragment return inflater.inflate(R.layout.example_fragment, container, false);

} }

• Die drei Argumente von inflate()– Recource ID des Layout das gezeichnet werden soll– Der container der die ViewGroup enthält ??????????– Ein Boolscher-Wert der aussagt ob die das gezeichnete Layout der ViewGroup hinzugefügt werden

soll, oder nicht. In diesem fall nicht da das System automatisch das gezeichnete Layout in den Container einfügt.

Page 12: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Adding Fragment to Activity• Es gibt zwei Wege um ein Fragment einer Activity hinzuzufügen:

1. Deklariere das Fragment in der Layout-Datei der Activity:• <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment

android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" />

<fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" />

</LinearLayout>

Page 13: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Adding Fragment to Activity• Es gibt zwei Wege um ein Fragment einer Activity hinzuzufügen:

1. .2. oder, direkt im Programmcode:

– Wir brauchen eine ViewGroup in die das Fragment geladen werden kann,– Und eine Transaktion die diese Aktion ausführt.

FragmentManager fragmentManager = getFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaktion();ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit();

- zu add() erstes Argument: ViewGroup, zweites Argument: Fragment

Page 14: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Managing Fragments• Um vorhandene Fragmente zu bearbeiten wird der FragmentManager

genutzt. Ihn bekommt man indem man die getFragmentManager()-Methode der Activity aufruft.

• Der FragmentManager bietet Funktionen wie:– findFragmentByID()– findFragmentByTag()– popBackStack() oder– addOnBackStackChangeListener()

Weitere Funktionen und genaue Beschreibungen der aufgezählten Funktionen unter: Fragment Manager - Android Dokumentation

• Der Fragment Manager kann wie im vorhergehenden Beispiel aber auch eine Transaktion öffnen.

Page 15: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Performing Fragment Transactions• Jede Änderung (add, remove, replace, …) die am Fragment gemacht und

zur Activity commited wird ist eine Transaktion.• Diese können über die API‘s der FragmentTransactoin ausgeführt werden.• Bespiel um ein Fragment zu ersetzen(replace):

– // Create new fragment and transaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stacktransaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);

// Commit the transaction transaction.commit();

Page 16: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Communicating with the Activity• Ein Fragment ist ein Objekt das unabhänging von einer Activity

implementiert ist und kann so in mehreren Activities genutzt werden.• Eine Instanz eines Fragments ist direkt mit einer Activity verknüpft.• Ein Fragment kann ganz einfach über getActivity() auf die Activity

zugreifen:– View listView = getActivity().findViewById(R.id.list);

• Wenn gewünscht kann auch die Activity auf das Fragment zugreifen und dort verschiedene Transaktionen ausführen:– ExampleFragment fragment =

(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

Page 17: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating event callbacks to the activity

• Für Fälle in denen ein Fragment ein Event mit der Activity teilt.• Ein guter Weg das zu implementieren ist eine Definition eines Callback-

Interface im Fragment mit der Voraussetzung das die Host-Activity dieses implementieren muss.

• Wenn die Activity einen Callback-Aufruf durch das Interface bekommt,kann sie wie gewünscht Informationen mit anderen Fragmenten im Layout teilen.

Page 18: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating event callbacks to the activity

Beispiel:• Eine News-App stellt zwei Fragmente dar, eine Liste der Meldungen

(fragment A) und daneben eine Detailansicht (fragment B).• Fragment A muss dabei der Detailansticht bescheid geben wenn ein

Artikel ausgewählt wird, damit dieser angezeigt werden kann.• Hier wird nun das OnArticleSelectedListener-Interface im Fragment A

deklariert:– public static class FragmentA extends ListFragment {

... // Container Activity must implement this interface public interface OnArticleSelectedListener {

public void onArticleSelected(Uri articleUri); } ...

}

Page 19: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating event callbacks to the activity

• Dann implementiert die Activity die das Fragment ausführt das OnArticleSelectedListener-Interface und überschreibt die Methode onArticleSelected() um Fragment B über das Event zu informieren.

• Um sicherzugehen das die ausführende Activity das Interface implementiert, muss die Callback-Methode onAttach() von Fragment A eine Instanz des OnArticleSelectListerner‘s instazieren bei dem auch die Activity über die onAtach() eingebunden wird.– public static class FragmentA extends ListFragment {

OnArticleSelectedListener mListener; ... @Override public void onAttach(Activity activity) {

super.onAttach(activity); try {

mListener = (OnArticleSelectedListener) activity; } catch (ClassCastException e) {

throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");

} } ...

}

Page 20: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating event callbacks to the activity

• Wenn die Activity das Interface nicht implementiert, dann wirft das Fragment eine ClassCastException.

• Bei Erfolg, hält der mListener eine Reference auf den in der Activity implementierten OnArticleSelectedListener, so kann Fragment A Events an die Activity weitergeben indem sie Methoden aufruft die im OnArticleSelectedListener-Interface definiert sind.

• Bespiel: Wenn Fragment A eine Erweiterung des List Fragments ist, wird jedesmal wenn ein User auf einen Listeneintrag klickt, vom System die Methode onListItemClick() des Fragments aufgerufen, welches dann onArticleSelected() aufruft um das Event mit der Activity zu teilen.

(Beispiel -> nächste Seite)

Page 21: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Creating event callbacks to the activity

public static class FragmentA extends ListFragment {

OnArticleSelectedListener mListener;...@Overridepublic void onListItemClick(ListView l, View v, int position, long id){

// Append the clicked item's row ID // with the content provider UriUri noteUri = ContentUris.withAppendedId(

ArticleColumns.CONTENT_URI, id); // Send the event and Uri to the host activity mListener.onArticleSelected(noteUri);

}...

}

Page 22: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Adding items to the action bar• Ein Fragment kann dem OptionsMenu der Activity Einträge hinzufügen

indem es onCreateOptionsMenu() implementiert.• Dazu muss aber in der onCreate() die Methode setHasOptionMenu()

aufgerufen werden, dabei wird bekanntgegeben dass das Fragment dem OptionsMenu Einträge hinzufügen möchte.

• Jeder Eintrag der vom Fragment hinzugefügt wird, wird an existierende Items angehängt. Das Fragment empfängt Callback mit onOptionsItemSelected() wenn der Eintrag gewählt wird.

• Man kann ebenso eine Context-Menu Sicht im Fragment-Layout registrieren indem man registerForContextMenu() aufruft. Wenn der User das Menu aufruft bekommt das Fragment einen Call auf onCreateOptionsMenu(). Wenn der User ein Eintrag auswählt, bekommt das Fragment einen Call auf onContextItemSelected().

Page 23: Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer

Handling the Fragment Lifecycle• Grafik und genaue Beschreibung hier:

Android Dokumentation - Fragment Lifecycle