Android - Fragmente 28.08.2012.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
der Universität Oldenburg
Strategie (Strategy / Policy) Ein objektbasiertes Verhaltensmuster Stephan Munkelt, Stefan Salzmann - 03IN.
Ein Beispiel in Java.
Softwareentwicklung für Android
Was ist neu in VS 2003 ? Ein Überblick. Bernd Marquardt Software & Consulting
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Objektrelationales Mapping mit JPA Working with Persistent Objects Jonas Bandi Simon Martinelli.
Ausnahmen HS Merseburg (FH) WS 06/07.
Threads Richard Göbel.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Wie überwacht man Objekte im "Alltag" ?. Indem man "Wanzen" an diese anbringt.
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
Sebastian Grahn Sebastian Kühn
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Command Pattern Karola Schäuble,
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
UNDO & SELECT Vortrag : Martin Hiersche
DVG Einführung in Java1 Einführung in JAVA.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
FH-Hof 1 XML-Parser Richard Göbel. FH-Hof 2 XML-Parser- DOM Object Tree Parser Objekt der Klasse 'DocumentBuilderFactory' mit 'newInstance()' erzeugen.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Tipps und Tricks für Word 2000 Aytac, Felix, Steffen 04/05.
Prof. Dr. Gerhard Schmidt pres. by H.-J. Steffens Software Engineering SS 2009Folie 1 Objektmodellierung Objekte und Klassen Ein Objekt ist ein Exemplar.
Die Persistenzschicht
Outlook_03 - Freigabe von Postfächern für Kollegen
Anlegen von Ordnern, speichern und Öffnen von Bildern und Briefen
AWT und JFC Abstract Windowing Toolkit
Hyperlinks und Anker Links notieren
Android-App/NerdKalender
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Game Development mit LUA Integration und Kommunikation von LUA mit C++ Referat von Paul van Hemmen Seminar: Reusable Content in 3D und Simulationssystemen.
Grundlagen der Programmierung
Gruppe: Gewinnt Überblick 1.0 (Martin Kapfhammer)
Reiner Ganser Solution Architect 1stQuad Solutions GmbH Presentation Subtitle.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Aufgaben Version 1: Es soll eine Wetterstation mit folgenden zwei Anzeigen implementiert werden: Aktuelle Wetterbedingungen mit Temperatur und.
Objectives Verstehen was unterDelegate verstanden wird
EPROG Tutorium #5 Philipp Effenberger
Torque in Turbine Team 4 Josef Bohninger Thomas Lindenhofer
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Java-Kurs Übung Benutzeroberflächen und Graphik Frames (Fenster)
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Abstrakte Klassen und das Interface-Konzept
Wien Oberflächengestaltung und Gestensteuerung Styles, ActionBar und Gestensteuerung.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Implementieren von Klassen
 Präsentation transkript:

Android - Fragmente 28.08.2012

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

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.

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.

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)

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.

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: onCreate() Aufruf bei erstellen der Fragments – initallisieren von Elementen die behalten werden sollen bis das Fragment zerstört wird. 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). onPause() Aufruf beim verlassen des Fragments – hier können Änderungen gespeichert werden die persistent gesichert werden sollen.

Creating a Fragment Es gibt fertig implementierte Sub-Klassen der Klasse Fragment für unterschiedliche Zwecke: 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. ListFragment Stellt eine von einem Adapter gemanagte Liste dar (gleich wie ListActivity). PreferenceFragment Stellt eine Liste von Preferences dar (gleich wie PreferenceActivity). Nützlich wenn eine „Settings“-Activity für eine Anwendung erstellt werden soll.

Lifecycle

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.

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.

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

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

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.

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

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

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.

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

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

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)

Creating event callbacks to the activity public static class FragmentA extends ListFragment { OnArticleSelectedListener mListener; ... @Override 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); } ... }

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

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