Scroll to top

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Der Begriff der Fragmente wurde in Android 3.0, API Level 11, eingeführt. Seitdem wurden in der Android-Community sechs wichtige Plattformversionen veröffentlicht. Dennoch steht mehr als der Hälfte der aktiven Android-Geräte diese Funktion nicht nativ zur Verfügung. Entwickler müssen stattdessen die Android Support-Bibliothek verwenden, wenn sie Fragmente mit diesen Geräten verwenden möchten. In diesem Lernprogramm erfahren Sie, wie Sie mithilfe der Android-Support-Bibliothek eine grundlegende fragmentbasierte App erstellen.

Schritt 0: Erste Schritte

Dieses Tutorial richtet sich an Android-Entwickler, die die überwiegende Mehrheit der derzeit in den Händen der Benutzer befindlichen Android-Geräte ansprechen möchten und die Fragment-API nutzen möchten, die die Unterstützung für eine Vielzahl von Bildschirmgrößen vereinfacht. Sie sollten mit Java und Eclipse vertraut sein und mit den Grundlagen von Android vertraut sein.

Dieses Tutorial ist auch für diejenigen gedacht, die detailliertere Anweisungen benötigen als das, was unser anderes Fragment-Tutorial gegeben hat, oder für diejenigen, die eine neue Sicht auf Fragmente benötigen.

Um die Auswirkungen und Unterschiede eines reaktionsschnellen, gut gestalteten Fragmentbildschirmdesigns vollständig zu erkennen, benötigen Sie zwei Geräte (oder konfigurierte Emulatoren): eines mit einem normalen Bildschirm in Telefongröße und eines mit einem Bildschirm in Tablet-Größe.

Beachten Sie, dass dieser Code auf dem Best-Practices-Code basiert, der vom Assistenten für neue Android-Anwendungen in Eclipse erstellt wurde. Das Projekt kann beim Google Code Hosting heruntergeladen und durchsucht werden, ebenso wie die installierbare Binärdatei.

Schritt 1: Klassische Zwei-Fenster-Ansicht

Das Beispiel hier ist das klassische Fragmentbeispiel, das auch als "Master-Detail" -Fluss bezeichnet wird. Wir beginnen mit einer Liste von „Dingen“ (Gegenstände, es können Lieder, Filme, Haustiere usw. sein) und wenn ein „Ding“ angeklickt wird, zeigen wir die Details für dieses bestimmte „Ding“ an. Wenn die Bildschirmgröße des Geräts sowohl die Liste als auch die Details anzeigen kann, werden zwei Fragmente verwendet. Andernfalls wird nur eine verwendet, und der Benutzer muss auf klicken, um einen Drilldown zu den Details durchzuführen.

Hier ist eine Abbildung, die die typische Bildschirmorganisation vor Fragmenten zeigt oder wenn der Bildschirm nicht groß genug ist, um so viele Informationen nebeneinander zu verarbeiten:

Single Pane FragmentsSingle Pane FragmentsSingle Pane Fragments

Und hier ist das Bildschirmdesign, wenn es mit Fragmenten fertig ist, wie es auf einem großen oder breiten Gerät wie einem Tablet angezeigt wird:

Dual Pane FragmentsDual Pane FragmentsDual Pane Fragments

Fragmente machen Aktivitäten nicht überflüssig. Tatsächlich benötigen Sie noch zwei Aktivitäten: Eine Aktivität behandelt den Fall, in dem beide Fragmente angezeigt werden (Zwei-Fenster-Modus), und eine andere die Detailansicht, wenn nur die Liste auf dem ersten Bildschirm angezeigt wurde, da der Gerätebildschirm angezeigt wird Größe war klein. Durch die Verwendung entsprechend organisierter Ressourcen wird die erste Aktivität dynamisch an die Bildschirmbreite angepasst. Intern muss diese Aktivität wissen, ob sie sich im Zwei-Fenster-Modus befindet oder nicht, damit sie das Detailfragment korrekt platzieren oder die Detailaktivität nach Bedarf erzeugen kann, die nur das Detailfragment enthält.

Zur Vereinfachung: Sie müssen zwei Aktivitätsklassen und zwei Fragmentklassen implementieren, um diese Fälle zu behandeln. Die Aktivitätsklassen sind ziemlich einfach, da sie nur das richtige Fragment oder die richtigen Fragmente anzeigen und den App-Fluss steuern. In unserem Beispiel verwenden wir die folgenden Aktivitätsklassen: die Hauptklasse CircleListActivity, die manchmal verwendete Detailklasse CircleDetailActivity. Wir haben auch die zwei Fragmentklassen, die tatsächlich Layout und Zeichnung ausführen: CircleListFragment und CircleDetailFragment. Ja, wir reden über Kreise. Kreise sind nur Dinge. Sie müssen sich nicht mit dem „Ding“ befassen, das wir ausgewählt haben.

Schritt 2: Erstellen der primären Aktivität

Die Hauptaktivität CircleListActivity ist der Ausgangspunkt für das Laden eines oder beider Fragmente für den Bildschirm.

1
 
2
import android.content.Intent;
3
import android.os.Bundle;
4
import android.support.v4.app.FragmentActivity;
5
6
public class CircleListActivity extends FragmentActivity {
7
	private boolean mTwoPane;
8
9
	@Override
10
	protected void onCreate(Bundle savedInstanceState) {
11
		super.onCreate(savedInstanceState);
12
		setContentView(R.layout.activity_circle_list);
13
14
		if (findViewById(R.id.circle_detail_container) != null) {
15
16
			mTwoPane = true;
17
18
			((CircleListFragment) getSupportFragmentManager().findFragmentById(
19
					R.id.circle_list)).setActivateOnItemClick(true);
20
		}
21
22
	}
23
24
}

Beachten Sie, dass wir den Android Support FragmentManager verwenden, nicht den in Android 3.0 eingeführten.

Die Aktivitätsklasse macht jedoch sehr wenig. Die gesamte Hauptlogik erfolgt automatisch, da das Android-Betriebssystem beim Aufruf der Methode setContentView() die richtige Layoutressourcenversion für das Gerät lädt. Dies bedeutet, dass Sie Ihre Aufmerksamkeit nur auf die betreffenden Ressourcen konzentrieren müssen. Wie wählt die Ressource ein oder zwei Fragmente richtig aus?

Schritt 3: Definieren der Layouts für die Bildschirme

Pop Quiz: Wie viele Layouts benötigen wir, um beide Fragmente anzuzeigen?

Antwort: 3, aber das beinhaltet nicht das Layout jedes Fragments.

Wir benötigen ein Layout, das sowohl das Listenfragment als auch das Detailfragment anzeigt. Wir brauchen ein anderes Layout, das nur das Listenfragment zeigt. Schließlich benötigen wir ein drittes Layout, das nur das Detailfragment zeigt.

Layouts können ein Fragment-Tag verwenden, um ein bestimmtes zu ladendes Fragment anzugeben. Dies funktioniert jedoch nur für feste Fragmente. Für dynamische Fragmente, z. B. das Detailfragment, das je nach Auswahl unterschiedliche Informationen anzeigt, verwenden wir eine Containeransicht, um anzugeben, wohin das Fragment im Layout gehen soll. Der am häufigsten verwendete Container ist ein FrameLayout, da es nur ein untergeordnetes Element enthält und dann an einer beliebigen Stelle im enthaltenen Layout als Block positioniert werden kann.

Zu Beginn erstellen wir die beiden Layouts für einzelne Fragmente.

Zunächst das Layout, in dem nur das Listenfragment angezeigt wird:

1
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
2
    android:id="@+id/circle_list"
3
    android:name="com.mamlambo.circlesfragmentexample.CircleListFragment"
4
    android:layout_width="match_parent"
5
    android:layout_height="match_parent"
6
    android:layout_marginLeft="16dp"
7
    android:layout_marginRight="16dp"
8
/>

Nun das Layout, das nur das Detailfragment anzeigt:

1
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
    android:id="@+id/circle_detail_container"
3
    android:layout_width="match_parent"
4
    android:layout_height="match_parent"
5
 />

Wenn diese ziemlich einfach aussehen, liegt es daran, dass sie es sind. Um es noch einmal zu wiederholen: Dies sind die Layouts, die bestimmen, wo sich die Fragmente befinden, und nicht, wie die Fragmente aussehen.

Kombinieren wir sie abschließend zu einem Layout, in dem beide Fragmente angezeigt werden:

1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
3
    android:layout_width="match_parent"
4
    android:layout_height="match_parent"
5
    android:layout_marginLeft="16dp"
6
    android:layout_marginRight="16dp"
7
    android:orientation="horizontal"
8
    android:showDividers="middle"
9
    >
10
11
    <fragment
12
        android:id="@+id/circle_list"
13
        android:name="com.mamlambo.circlesfragmentexample.CircleListFragment"
14
        android:layout_width="0dp"
15
        android:layout_height="match_parent"
16
        android:layout_weight="1"/>
17
18
    <FrameLayout
19
        android:id="@+id/circle_detail_container"
20
        android:layout_width="0dp"
21
        android:layout_height="match_parent"
22
        android:layout_weight="3" />
23
24
</LinearLayout>

Nachdem Sie nun wissen, wie die Layouts aussehen, fragen Sie sich möglicherweise immer noch, wie das richtige Programm programmgesteuert ausgewählt wird.

Schritt 4: Organisieren der Layouts für verschiedene Szenarien

Sie wissen, dass das Android-Betriebssystem basierend auf den aktuellen Geräteeigenschaften geeignete Ressourcen auswählt. Auf den ersten Blick können Sie also Layouts in Ordnern wie Layout-Land, Layout-Groß, Layout-Klein usw. platzieren. Sie würden das Layout der einzelnen Listenfragmente genauso benennen wie das Layout der doppelten Fragmente und beide in verschiedenen Ordnern ablegen. Dies könnte sogar funktionieren, aber diese Methode ist schwer zu warten, da mehrere verschiedene Dateien für mehrere identische Layouts vorhanden sind.

Stattdessen können Sie Verweise verwenden, um aus einem bestimmten Ressourcenordner auf ein bestimmtes Element in Android zu verweisen. Es ist am besten, ein Beispiel dafür zu sehen. Wir werden unsere drei aktivitätsbasierten Layouts benennen (im Gegensatz zu den einzelnen darin enthaltenen Fragmenten): activity_circle_detail, activity_circle_list und activity_circle_twopane. Dann legen wir alle drei in den Standardlayoutordner. Sie haben bereits im Code aus Schritt 2 gesehen, dass wir immer nur das Layout activity_circle_list laden. Oder wir?

Fügen wir nun einige Referenzen hinzu. Ein guter Weg, um festzustellen, ob der Bildschirm für zwei nebeneinander liegende Fenster geeignet ist, ist die Breite in dp-Einheiten. Angenommen, unser Layout mit zwei Fenstern erfordert mindestens 850 dp Bildschirmbreite. Erstellen wir einen Ordner mit dem Namen values-w850dp. Dies sollte 7-Zoll-Tablets mit hoher Dichte und 10-Zoll-Tablets mittlerer Dichte im Querformat abdecken, enthält jedoch keine xddpi-Telefone und schließt den Hochformatmodus auf den meisten Geräten aus, mit Ausnahme einiger Bildschirme mit sehr hoher Auflösung. Erstellen Sie in diesem Ordner eine Datei mit dem Namen refs.xml und platzieren Sie Folgendes darin:

1
<resources>
2
    <item name="activity_circle_list" type="layout">@layout/activity_circle_twopane</item>
3
</resources>

Wie funktioniert das? Wenn die Breite 850 dp oder mehr beträgt, wird diese Referenz zum Laden des Layouts verwendet. Das bedeutet, dass das Layout mit zwei Fenstern verwendet wird, anstatt dass die einzelnen Fenster separat angezeigt werden. Da dieses Ressourcenqualifikationsmerkmal (Konvention zur Benennung von Ordnern) erst auf API-Ebene 13 eingeführt wurde, möchten wir dieselbe Referenz auch in ein anderes geeignetes Qualifikationsmerkmal für Ordner aufnehmen, das es schon viel länger gibt, z. B. values-xlarge-land. Extra groß ist definiert als mindestens 960 dp mal 720 dp, daher müssen wir auch sicherstellen, dass es nur im Querformat angezeigt wird, indem wir das Land-Qualifikationsmerkmal einschließen.

Nachdem die Layouts organisiert sind, ist es Zeit, uns wieder auf den Java-Code zu konzentrieren. Während beim ersten Start der Listenaktivität das richtige Layout auf dem Bildschirm angezeigt wird, was passiert, wenn auf eines der Listenelemente getippt wird?

Schritt 5: Definieren des Listenfragments

Das Listenfragment behandelt die Anzeige unserer Reihe von Dingen (in diesem Fall Kreise). Es ist nicht anders als eine ListActivity, da es eine gewisse Handhabung von Routinelistenaufgaben bietet, um Ihre eigene Codierung zu vereinfachen. Die Liste muss alle Kreise aus der Datenquelle enthalten (in diesem Fall eine Scheindatenquelle) und Taps auf bestimmte Elemente verarbeiten, um die Details anzuzeigen. Da ein Fragment jedoch keine Aktivität ist, sollte es Ereignisse weitergeben, die möglicherweise den Bildschirm in die steuernde Aktivitätsklasse ändern. Durch Tippen im Modus mit zwei Fenstern wird ein Fragment im anderen Bereich auf demselben Bildschirm geladen, während durch Tippen im Modus mit einem Fenster eine neue Aktivität mit dem Detailfragment geladen werden sollte. Das Fragment kennt diese Konfigurationsdetails jedoch nicht und sollte es auch nicht wissen.

Sie müssen jedoch eine konsistente Methode erstellen, um diese Informationen an die enthaltende oder steuernde Aktivität weiterzugeben, die diese Details kennt und kennen sollte. Am häufigsten wird diese Kommunikation über eine im Fragment definierte Schnittstellenklasse verwaltet, die von jeder Aktivität implementiert werden muss, die sie verwendet - eine typische Methode zum Ausführen von Rückrufen.

Hier finden Sie den gesamten Code für die CircleListFragment-Klasse, einschließlich eines sicheren Rückrufmechanismus und der Tap-Behandlung, die die Rückrufmethode aufruft, um die Workflow-Behandlung an die steuernde Aktivität zu übergeben.

1
import android.app.Activity;
2
import android.os.Bundle;
3
import android.support.v4.app.ListFragment;
4
import android.view.View;
5
import android.widget.ArrayAdapter;
6
import android.widget.ListView;
7
8
import com.mamlambo.circlesfragmentexample.dummy.DummyContent;
9
10
public class CircleListFragment extends ListFragment {
11
12
	private static final String STATE_ACTIVATED_POSITION = "activated_position";
13
	private Callbacks mCallbacks = sDummyCallbacks;
14
	private int mActivatedPosition = ListView.INVALID_POSITION;
15
	public interface Callbacks {
16
		public void onItemSelected(String id);
17
	}
18
19
	private static Callbacks sDummyCallbacks = new Callbacks() {
20
		@Override
21
		public void onItemSelected(String id) {
22
		}
23
	};
24
25
	public CircleListFragment() {
26
	}
27
28
	@Override
29
	public void onCreate(Bundle savedInstanceState) {
30
		super.onCreate(savedInstanceState);
31
32
		setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
33
				android.R.layout.simple_list_item_activated_1,
34
				android.R.id.text1, DummyContent.ITEMS));
35
	}
36
37
	@Override
38
	public void onViewCreated(View view, Bundle savedInstanceState) {
39
		super.onViewCreated(view, savedInstanceState);
40
41
		if (savedInstanceState != null
42
				&amp;&amp; savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
43
			setActivatedPosition(savedInstanceState
44
					.getInt(STATE_ACTIVATED_POSITION));
45
		}
46
	}
47
48
	@Override
49
	public void onAttach(Activity activity) {
50
		super.onAttach(activity);
51
52
		if (!(activity instanceof Callbacks)) {
53
			throw new IllegalStateException(
54
					"Activity must implement fragment's callbacks.");
55
		}
56
57
		mCallbacks = (Callbacks) activity;
58
	}
59
60
	@Override
61
	public void onDetach() {
62
		super.onDetach();
63
64
		mCallbacks = sDummyCallbacks;
65
	}
66
67
	@Override
68
	public void onListItemClick(ListView listView, View view, int position,
69
			long id) {
70
		super.onListItemClick(listView, view, position, id);
71
72
		mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
73
	}
74
75
	@Override
76
	public void onSaveInstanceState(Bundle outState) {
77
		super.onSaveInstanceState(outState);
78
		if (mActivatedPosition != ListView.INVALID_POSITION) {
79
			outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
80
		}
81
	}
82
83
	public void setActivateOnItemClick(boolean activateOnItemClick) {
84
		getListView().setChoiceMode(
85
				activateOnItemClick ? ListView.CHOICE_MODE_SINGLE
86
						: ListView.CHOICE_MODE_NONE);
87
	}
88
89
	private void setActivatedPosition(int position) {
90
		if (position == ListView.INVALID_POSITION) {
91
			getListView().setItemChecked(mActivatedPosition, false);
92
		} else {
93
			getListView().setItemChecked(position, true);
94
		}
95
96
		mActivatedPosition = position;
97
	}
98
}

Abgesehen von der zuvor beschriebenen Funktionalität gibt es eine ListView-Verwaltung, sodass das angeklickte Listenelement im Dual-Pane-Modus als ausgewählt angezeigt wird, sowie eine grundlegende Verwaltung des Fragmentlebenszyklus. Nach wie vor verwenden wir die Support Fragment-Version, damit wir mit älteren Geräten abwärtskompatibel sind. Stellen Sie sicher, dass Sie das richtige Paket in die Support-Bibliothek importieren (import android.support.v4.app.ListFragment).

Jetzt müssen wir zur steuernden Aktivitätsklasse zurückkehren, damit sie den Rückruf behandelt.

Schritt 6: Aktualisieren der primären Aktivität

Fügen Sie die Rückrufunterstützung zur primären Aktivitätsklasse CircleListActivity hinzu, indem Sie die zuvor erstellte Schnittstelle CircleListFragment.Callbacks implementieren. Implementieren Sie dann die onItemSelected() -Methode, um das App-Verhalten basierend darauf zu verzweigen, ob das Gerät den Zwei-Fenster-Modus verarbeiten kann oder nicht. Hier ist die vollständig aktualisierte Klasse:

1
import android.content.Intent;
2
import android.os.Bundle;
3
import android.support.v4.app.FragmentActivity;
4
5
public class CircleListActivity extends FragmentActivity implements
6
		CircleListFragment.Callbacks {
7
8
	private boolean mTwoPane;
9
10
	@Override
11
	protected void onCreate(Bundle savedInstanceState) {
12
		super.onCreate(savedInstanceState);
13
		setContentView(R.layout.activity_circle_list);
14
15
		if (findViewById(R.id.circle_detail_container) != null) {
16
			mTwoPane = true;
17
18
			((CircleListFragment) getSupportFragmentManager().findFragmentById(
19
					R.id.circle_list)).setActivateOnItemClick(true);
20
		}
21
22
		// TODO: If exposing deep links into your app, handle intents here.

23
	}
24
25
	@Override
26
	public void onItemSelected(String id) {
27
		if (mTwoPane) {
28
			Bundle arguments = new Bundle();
29
			arguments.putString(CircleDetailFragment.ARG_ITEM_ID, id);
30
			CircleDetailFragment fragment = new CircleDetailFragment();
31
			fragment.setArguments(arguments);
32
			getSupportFragmentManager().beginTransaction()
33
					.replace(R.id.circle_detail_container, fragment).commit();
34
35
		} else {
36
			Intent detailIntent = new Intent(this, CircleDetailActivity.class);
37
			detailIntent.putExtra(CircleDetailFragment.ARG_ITEM_ID, id);
38
			startActivity(detailIntent);
39
		}
40
	}
41
}

Mithilfe des Flags, um festzustellen, ob die Doppelfensteransicht angezeigt wird, startet die onItemSelected() -Methode entweder eine neue Aktivität oder ersetzt jedes aktuelle Fragment in R.id.circle_detail_container durch eine neue Instanz der CircleDetailFragment-Klasse. Für diese Art von Design wird wenig mehr benötigt. Der Bezeichner, auf welchen Kreis der Benutzer getippt hat, wird entweder über Argumente an die neue Fragmentinstanz oder an die neue Aktivität übergeben, wo der Bezeichner ebenfalls in Argumente umgewandelt wird.

Zu diesem Zeitpunkt müssen wir sowohl die CircleDetailActivity-Klasse für den Einzelbereich als auch die CircleDetailFragment-Klasse implementieren.

Schritt 7: Definieren der Einzelfenster-Detailaktivität

Erinnern Sie sich an die Einfachheit des Layouts für diese Aktivitätsklasse. Das Layout ist einfach ein Platzhalter für die Detailfragmentklasse. Alles, was diese Aktivität tun muss, ist, den Bezeichner an ihn zu übergeben, ihn in ein Fragment-Argument umzuwandeln und das Fragment dann dem Container hinzuzufügen.

1
package com.mamlambo.circlesfragmentexample;
2
3
import android.os.Bundle;
4
import android.support.v4.app.FragmentActivity;
5
public class CircleDetailActivity extends FragmentActivity {
6
7
	@Override
8
	protected void onCreate(Bundle savedInstanceState) {
9
		super.onCreate(savedInstanceState);
10
		setContentView(R.layout.activity_circle_detail);
11
12
				if (savedInstanceState == null) {
13
			Bundle arguments = new Bundle();
14
			arguments.putString(CircleDetailFragment.ARG_ITEM_ID, getIntent()
15
					.getStringExtra(CircleDetailFragment.ARG_ITEM_ID));
16
			CircleDetailFragment fragment = new CircleDetailFragment();
17
			fragment.setArguments(arguments);
18
			getSupportFragmentManager().beginTransaction()
19
					.add(R.id.circle_detail_container, fragment).commit();
20
		}
21
	}
22
}

Wenn es einfach klang, können Sie jetzt sehen, dass es ist. Das letzte Stück, das wir erreichen müssen, ist das Detailfragment selbst.

Schritt 8: Zeigen Sie das Detailfragment an

Die Detailfragmentklasse muss sehen, welche Kreisdaten geladen und angezeigt werden sollen. Dann müssen diese Daten geladen und angezeigt werden. Die Klasse lädt ein Layout. Das Layoutdesign kann allgemein gehalten sein, sollte jedoch die Tatsache berücksichtigen, dass es als Fragment Vollbild sein kann oder nicht. Mit anderen Worten, machen Sie wie üblich keine Annahmen über die Bildschirmgröße des Geräts. Natürlich können Sie auch wie gewohnt mehrere Layouts basierend auf Ressourcenqualifizierern erstellen. Beachten Sie, dass diese basierend auf den allgemeinen Eigenschaften des Gerätebildschirms und nicht basierend auf den Eigenschaften des Anzeigebereichs (Fenstermodi) geladen werden.

In diesem Beispiel gibt es keine weitere Navigation, sodass kein Rückruf erforderlich ist, wie dies beim Listenfragment der Fall war.

Hier ist ohne weiteres der gesamte Code für die CircleDetailFragment-Klasse:

1
import android.os.Bundle;
2
import android.support.v4.app.Fragment;
3
import android.view.LayoutInflater;
4
import android.view.View;
5
import android.view.ViewGroup;
6
import android.widget.ImageView;
7
import android.widget.TextView;
8
9
import com.mamlambo.circlesfragmentexample.dummy.DummyContent;
10
11
public class CircleDetailFragment extends Fragment {
12
	public static final String ARG_ITEM_ID = "item_id";
13
14
	private DummyContent.DummyItem mItem;
15
	public CircleDetailFragment() {
16
	}
17
18
	@Override
19
	public void onCreate(Bundle savedInstanceState) {
20
		super.onCreate(savedInstanceState);
21
22
		if (getArguments().containsKey(ARG_ITEM_ID)) {
23
			mItem = DummyContent.ITEM_MAP.get(getArguments().getString(
24
					ARG_ITEM_ID));
25
		}
26
	}
27
28
	@Override
29
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
30
			Bundle savedInstanceState) {
31
		View rootView = inflater.inflate(R.layout.fragment_circle_detail,
32
				container, false);
33
34
		if (mItem != null) {
35
			((TextView) rootView.findViewById(R.id.circle_detail))
36
					.setText(mItem.content);
37
			((ImageView) rootView.findViewById(R.id.circle_view))
38
					.setImageResource(mItem.resourceId);
39
		}
40
41
		return rootView;
42
	}
43
}

Obwohl der gesamte Code im Wesentlichen mit einem Nicht-Support-Fragment identisch ist, beachten Sie den richtigen Import für android.support.v4.app.Fragment, um sicherzustellen, dass Sie die richtige Android-Support-Klasse verwenden.

Schritt 9: Aktualisieren der Android-Manifestdatei für Fragmente

Jetzt müssen wir die Fragmente zur Manifestdatei hinzufügen, richtig? Nicht wirklich. Im Gegensatz zu Aktivitätsklassen werden Fragmente nicht in der Manifestdatei registriert. Fügen Sie einfach die Aktivitätsklassen zur Manifestdatei hinzu und los geht's.

Hier ist die Beispielmanifestdatei für Ihr Sehvergnügen:

1
<?xml version="1.0" encoding="utf-8"?>
2
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
    package="com.mamlambo.circlesfragmentexample"
4
    android:versionCode="1"
5
    android:versionName="1.0" >
6
7
    <uses-sdk
8
        android:minSdkVersion="8"
9
        android:targetSdkVersion="16" />
10
11
    <application
12
        android:allowBackup="true"
13
        android:icon="@drawable/ic_launcher"
14
        android:label="@string/app_name"
15
        android:theme="@style/AppTheme" >
16
        <activity
17
            android:name="com.mamlambo.circlesfragmentexample.CircleListActivity"
18
            android:label="@string/app_name" >
19
            <intent-filter>
20
                <action android:name="android.intent.action.MAIN" />
21
22
                <category android:name="android.intent.category.LAUNCHER" />
23
            </intent-filter>
24
        </activity>
25
        <activity
26
            android:name="com.mamlambo.circlesfragmentexample.CircleDetailActivity"
27
            android:label="@string/title_circle_detail"
28
            android:parentActivityName=".CircleListActivity" >
29
            <meta-data
30
                android:name="android.support.PARENT_ACTIVITY"
31
                android:value=".CircleListActivity" />
32
        </activity>
33
    </application>
34
35
</manifest>

Beachten Sie die große Auswahl an Android SDK-Versionen, die mit diesem Ansatz mithilfe der Fragmentfunktion der Unterstützungsbibliothek unterstützt werden können.

Schritt 10: Ausführen der App

Obwohl wir der Anwendung nicht den vollständigen Quellcode, der in diesem Lernprogramm eingefügt wurde, und die Ressourcen der Anwendung präsentiert haben, können Sie diese Details selbst eingeben. Oder Sie können den Code herunterladen (siehe Schritt 0), kompilieren und ausführen. Oder Sie können die vorkompilierte Binärdatei herunterladen und installieren.

Wenn Sie jedoch in einer Gerätekonfiguration mit einer Breite von 850 dp oder einem extra großen Bildschirm (mindestens 960 x 640 dp) arbeiten, sehen Sie dieses Bildschirmdesign (ein Bildschirm mit 1920 x 1200 Pixel bei 10 "):

Und wenn die Bildschirmbreite weniger als 850 dp beträgt, kehrt das Layout in den Einzelfenster-Modus zurück, z. B. diese 1280 Pixel breite Telefonanzeige im Querformat:

Oder dieses 768 Pixel breite Porträt-Telefon:

Oder dieses 1200px breite Porträt-Display auf einem Tablet:

Aufgrund der Verwendung abstrahierter Messungen, z. B. der Verwendung von dp-Einheiten, konnten Sie die beiden unterschiedlichen Layouts auf einem Bildschirm mit identischen Pixelauflösungen und unterschiedlichen Pixeldichten anzeigen. Dies hilft zu verhindern, dass die Informationsdichte (mehr Pixel bedeuten nicht immer, dass Ihre Benutzer mehr Daten wünschen) auf physisch kleinen Bildschirmen zu hoch ist, und ist eines der großartigen Dinge am Android-Ressourcensystem.

Abschluss

Sie haben die Grundlagen der Verwendung der Android Fragment API kennengelernt, die in der Android Support-Bibliothek verfügbar ist. Fragmente enthalten zwar viel, viel mehr, aber dieses Tutorial bietet Ihnen einen Ausgangspunkt für einen sehr häufigen Anwendungsfall, der das Erscheinungsbild vieler Anwendungen oder Teile von Anwendungen erheblich verbessern kann, unabhängig davon, mit welcher Android-Version sie ausgeführt werden oder Bildschirme, auf denen sie angezeigt werden.

Über die Autoren

Die mobilen Entwickler Lauren Darcey und Shane Conder haben mehrere Bücher zur Android-Entwicklung gemeinsam verfasst: ein ausführliches Programmierbuch mit dem Titel Android Wireless Application Development (jetzt in der dritten Ausgabe als zweibändiges Set), Sams Teach Yourself Android Application Development in 24 Stunden, und Erlernen der Programmierung von Android-Anwendungen für den Kindle Fire: Eine praktische Anleitung zum Erstellen Ihrer ersten Android-Anwendung. Wenn sie nicht schreiben, verbringen sie ihre Zeit damit, mobile Software in ihrem Unternehmen zu entwickeln und Beratungsdienste anzubieten. Sie können per E-Mail an androidwirelessdev+mt@gmail.com, über ihren Blog unter androidbook.blogspot.com und auf Twitter @androidwireless erreicht werden.

Benötigen Sie weitere Hilfe beim Schreiben von Android-Apps? Schauen Sie sich unsere neuesten Bücher und Ressourcen an!

Buy Android Wireless Application Development, 3rd Edition, Volume 1 Buy Sam's Teach Yourself Android Application Development in 24 Hours, 2nd Edition Mamlambo code at Code Canyon