Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Android - Fragmente 28.08.2012. Definition Verhalten oder Teil der Benutzeroberfläche einer Activity. Mehrere Fragmente können in einer Activity zu einer."—  Präsentation transkript:

1 Android - Fragmente

2 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

3 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.

4 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 -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.

5 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)

6 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.

7 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.

8 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.

9 Lifecycle

10 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.

11 Adding a UI Bsp. public static class ExampleFragment extends Fragment 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.

12 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:

13 Adding Fragment to Activity Es gibt zwei Wege um ein Fragment einer Activity hinzuzufügen: 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

14 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 DokumentationFragment Manager - Android Dokumentation Der Fragment Manager kann wie im vorhergehenden Beispiel aber auch eine Transaktion öffnen.

15 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 APIs 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 stack transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit();

16 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);

17 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.

18 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); }... }

19 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 OnArticleSelectListerners instazieren bei dem auch die Activity über die onAtach() eingebunden wird. – public static class FragmentA extends ListFragment { OnArticleSelectedListener public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnArticleSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); } }... }

20 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)

21 Creating event callbacks to the activity public static class FragmentA extends ListFragment { OnArticleSelectedListener public void onListItemClick(ListView l, View v, int position, long id) { // Append the clicked item's row ID // with the content provider Uri Uri noteUri = ContentUris.withAppendedId( ArticleColumns.CONTENT_URI, id); // Send the event and Uri to the host activity mListener.onArticleSelected(noteUri); }... }

22 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().

23 Handling the Fragment Lifecycle Grafik und genaue Beschreibung hier: Android Dokumentation - Fragment Lifecycle Android Dokumentation - Fragment Lifecycle


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

Ähnliche Präsentationen


Google-Anzeigen