Fragment erstellen

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

    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
}

Kotlin

dependencies {
    val fragment_version = "1.6.2"

    // 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 der Dialog übernehmen. Weitere Informationen finden Sie unter Dialogfelder mit DialogFragment anzeigen.
PreferenceFragmentCompat
Zeigt eine Hierarchie von Preference-Objekten als Liste an. Mit PreferenceFragmentCompat 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.