Ein Fragment ist ein modularer Teil der Benutzeroberfläche innerhalb einer Aktivität. Ein Fragment hat einen eigenen Lebenszyklus und erhält eigene Eingabeereignisse. Sie können Fragmente hinzufügen oder entfernen, während die beinhaltende Aktivität ausgeführt wird.
In diesem Dokument wird beschrieben, wie Sie ein Fragment erstellen und in eine Aktivität einbinden.
Umgebung einrichten
Fragmente erfordern eine Abhängigkeit von der AndroidX-Fragmentbibliothek. Du musst der Datei settings.gradle
deines Projekts das Maven-Repository von Google hinzufügen, um diese Abhängigkeit einzubeziehen.
Groovig
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Fügen Sie der Datei build.gradle
Ihrer App die folgenden Abhängigkeiten hinzu, um die AndroidX-Fragmentbibliothek in Ihr Projekt aufzunehmen:
Groovig
dependencies { def fragment_version = "1.8.1" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.1" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") }
Fragmentklasse erstellen
Erweitern Sie zum Erstellen eines Fragments die AndroidX-Klasse Fragment
und überschreiben Sie deren Methoden, um Ihre App-Logik einzufügen, ähnlich wie beim Erstellen einer Activity
-Klasse. Um ein minimales Fragment zu erstellen, das sein eigenes Layout definiert, stellen Sie die Layoutressource des Fragments für den Basiskonstruktor bereit, wie im folgenden Beispiel gezeigt:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
Die Fragment-Bibliothek bietet auch spezifischere Fragment-Basisklassen:
DialogFragment
- Zeigt ein unverankertes Dialogfeld an. Die Verwendung dieser Klasse zum Erstellen eines Dialogfelds ist eine gute Alternative zu den Dialoghilfsmethoden in der Klasse
Activity
, da Fragmente automatisch das Erstellen und Bereinigen derDialog
übernehmen. Weitere Informationen finden Sie unter Dialogfelder mitDialogFragment
anzeigen. PreferenceFragmentCompat
- Zeigt eine Hierarchie von
Preference
-Objekten als Liste an. MitPreferenceFragmentCompat
können Sie einen Einstellungsbildschirm für Ihre Anwendung erstellen.
Fragment zu einer Aktivität hinzufügen
Im Allgemeinen muss das Fragment in ein AndroidX-FragmentActivity
eingebettet sein, damit ein Teil der UI zum Layout dieser Aktivität hinzugefügt wird. FragmentActivity
ist die Basisklasse für AppCompatActivity
. Wenn Sie also bereits abgeleitete Klassen von AppCompatActivity
erstellen, um Abwärtskompatibilität in Ihrer Anwendung bereitzustellen, müssen Sie die Basisklasse der Aktivität nicht ändern.
Sie können Ihr Fragment zur Ansichtshierarchie der Aktivität hinzufügen, indem Sie es entweder in der Layoutdatei Ihrer Aktivität definieren oder indem Sie einen Fragmentcontainer in der Layoutdatei Ihrer Aktivität definieren und das Fragment dann programmatisch innerhalb Ihrer Aktivität hinzufügen. In beiden Fällen müssen Sie eine FragmentContainerView
hinzufügen, mit der die Position definiert wird, an der das Fragment in der Ansichtshierarchie der Aktivität platziert werden soll. Es wird dringend empfohlen, immer einen FragmentContainerView
als Container für Fragmente zu verwenden, da FragmentContainerView
Korrekturen speziell für Fragmente enthält, die andere Ansichtsgruppen wie FrameLayout
nicht bereitstellen.
Fragment über XML hinzufügen
Verwenden Sie ein FragmentContainerView
-Element, um der XML-Datei Ihres Aktivitätslayouts deklarativ ein Fragment hinzuzufügen.
Hier ist ein Beispiel für ein Aktivitätslayout mit einem einzelnen FragmentContainerView
:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.example.ExampleFragment" />
Das Attribut android:name
gibt den Klassennamen der zu instanziierenden Fragment
an. Wenn das Layout der Aktivität erhöht wird, wird das angegebene Fragment instanziiert, onInflate()
für das neu instanziierte Fragment aufgerufen und ein FragmentTransaction
erstellt, um das Fragment dem FragmentManager
hinzuzufügen.
Fragment programmatisch hinzufügen
Um dem Layout Ihrer Aktivität programmatisch ein Fragment hinzuzufügen, sollte das Layout einen FragmentContainerView
enthalten, der als Fragmentcontainer dient, wie im folgenden Beispiel gezeigt:
<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Im Gegensatz zum XML-Ansatz wird das Attribut android:name
hier nicht für FragmentContainerView
verwendet. Daher wird kein bestimmtes Fragment automatisch instanziiert. Stattdessen wird ein FragmentTransaction
verwendet, um ein Fragment zu instanziieren und dem Layout der Aktivität hinzuzufügen.
Während Ihre Aktivität ausgeführt wird, können Sie Fragmenttransaktionen ausführen, z. B. ein Fragment hinzufügen, entfernen oder ersetzen. In der FragmentActivity
können Sie eine Instanz von FragmentManager
abrufen, mit der ein FragmentTransaction
erstellt werden kann. Anschließend können Sie das Fragment in der onCreate()
-Methode Ihrer Aktivität mit FragmentTransaction.add()
instanziieren. Dabei geben Sie die ViewGroup
-ID des Containers in Ihrem Layout sowie die Fragmentklasse, die Sie hinzufügen möchten, an und führen dann einen Commit für die Transaktion durch, wie im folgenden Beispiel gezeigt:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, null) .commit(); } } }
Beachten Sie im vorherigen Beispiel, dass die Fragmenttransaktion nur erstellt wird, wenn savedInstanceState
den Wert null
hat. Dadurch wird sichergestellt, dass das Fragment nur einmal beim Erstellen der Aktivität hinzugefügt wird. Wenn eine Konfigurationsänderung erfolgt und die Aktivität neu erstellt wird, ist savedInstanceState
nicht mehr null
und das Fragment muss kein zweites Mal hinzugefügt werden, da es automatisch aus dem savedInstanceState
wiederhergestellt wird.
Wenn das Fragment einige Anfangsdaten erfordert, können Argumente an das Fragment übergeben werden, indem im Aufruf von FragmentTransaction.add()
ein Bundle
angegeben wird, wie unten dargestellt:
Kotlin
class ExampleActivity : AppCompatActivity(R.layout.example_activity) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val bundle = bundleOf("some_int" to 0) supportFragmentManager.commit { setReorderingAllowed(true) add<ExampleFragment>(R.id.fragment_container_view, args = bundle) } } } }
Java
public class ExampleActivity extends AppCompatActivity { public ExampleActivity() { super(R.layout.example_activity); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = new Bundle(); bundle.putInt("some_int", 0); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container_view, ExampleFragment.class, bundle) .commit(); } } }
Die Argumente Bundle
können dann im Fragment durch Aufrufen von requireArguments()
abgerufen werden. Die entsprechenden Bundle
-Getter-Methoden können zum Abrufen der einzelnen Argumente verwendet werden.
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val someInt = requireArguments().getInt("some_int") ... } }
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { int someInt = requireArguments().getInt("some_int"); ... } }
Siehe auch
Fragment-Transaktionen und FragmentManager
werden im Leitfaden zu Fragment-Manager ausführlicher behandelt.