Fragment erstellen

Ein Fragment stellt einen modularen Teil des Nutzers dar. innerhalb einer Aktivität. Ein Fragment hat seinen eigenen Lebenszyklus, eigene Eingabeereignisse verwenden und Fragmente hinzufügen oder entfernen, während das ausgeführt wird.

In diesem Dokument wird beschrieben, wie Sie ein Fragment erstellen und in eine Aktivität aufnehmen.

Umgebung einrichten

Fragmente erfordern eine Abhängigkeit vom AndroidX-Fragmentbibliothek Erforderliche Schritte Fügen Sie das Maven-Repository von Google hinzu. in die Datei settings.gradle Ihres Projekts ein, um diese Abhängigkeit aufzunehmen.

Cool

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        ...
    }
}

Kotlin

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        ...
    }
}

Fügen Sie Folgendes hinzu, um die AndroidX-Fragmentbibliothek in Ihr Projekt aufzunehmen: Abhängigkeiten in der build.gradle-Datei Ihrer Anwendung fest:

Groovy

dependencies {
    def fragment_version = "1.8.5"

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

Kotlin

dependencies {
    val fragment_version = "1.8.5"

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

Fragmentklasse erstellen

Erweitern Sie AndroidX, um ein Fragment zu erstellen. Fragment-Klasse und überschreiben zum Einfügen der Anwendungslogik, ähnlich wie bei eine Activity-Klasse. Um ein Minimum Fragments, das sein eigenes Layout definiert, geben Sie die Layoutressource des Fragments an. an den Basiskonstruktor übergeben, 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 Fragmentbibliothek bietet auch spezialisierte Fragment-Basisklassen:

DialogFragment
Ein unverankertes Dialogfeld wird angezeigt. Es empfiehlt sich, diese Klasse zum Erstellen eines Dialogfelds zu verwenden, als Alternative zu den Dialoghilfsmethoden im Klasse Activity, als Fragmente erstellt und bereinigt die Dialog automatisch. Weitere Informationen finden Sie unter Dialogfelder mit DialogFragment anzeigen. .
PreferenceFragmentCompat
Zeigt eine Hierarchie von Preference-Objekte als Liste. Mit PreferenceFragmentCompat können Sie Erstellen Sie einen Einstellungsbildschirm für Ihre App.

Fragment zu Aktivität hinzufügen

Im Allgemeinen muss dein Fragment in ein AndroidX- oder FragmentActivity bis einen Teil der Benutzeroberfläche zum Layout dieser Aktivität bei. FragmentActivity ist die Basisklasse für AppCompatActivity, Wenn Sie also AppCompatActivity bereits abgeleitet haben, Kompatibilität in Ihrer App haben, müssen Sie Ihre Aktivitäten nicht ändern. -Basisklasse.

Sie können Ihr Fragment der Ansichtshierarchie der Aktivität entweder durch Definieren des Fragments in der Layoutdatei Ihrer Aktivität oder durch Definieren eines in der Layoutdatei Ihrer Aktivität fragmentieren das programmatische Hinzufügen des Fragments aus Ihrer Aktivität heraus. In beiden Fällen müssen Sie zum Hinzufügen eines FragmentContainerView definiert die Position, an der das Fragment innerhalb des der Ansichtshierarchie der Aktivität. Es wird dringend empfohlen, immer einen FragmentContainerView als Container für Fragmente, wie FragmentContainerView enthält Korrekturen speziell für Fragmente, die andere Gruppen wie FrameLayout keine Informationen liefern.

Fragment über XML hinzufügen

Um ein Fragment deklarativ zum XML-Code Ihres Aktivitätslayouts hinzuzufügen, verwenden Sie einen FragmentContainerView-Element.

Hier ist ein Beispiel für ein Aktivitätslayout mit einem 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 Fragment an, zu instanziieren. Wenn das Layout der Aktivität zu groß ist, wird das angegebene Fragment instanziiert wird, onInflate() wird für das neu instanziierte Fragment aufgerufen und ein FragmentTransaction wird erstellt, um das Fragment zu FragmentManager hinzuzufügen.

Fragment programmatisch hinzufügen

Um dem Layout Ihrer Aktivität programmatisch ein Fragment hinzuzufügen, sollte ein FragmentContainerView enthalten, das als Fragmentcontainer dient, Dies wird 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 nicht für die FragmentContainerView, sodass kein bestimmtes Fragment automatisch instanziiert wurden. Stattdessen wird ein FragmentTransaction wird verwendet, um ein Fragment zu instanziieren und zum Layout der Aktivität hinzuzufügen.

Während Ihre Aktivität ausgeführt wird, können Sie fragmentierte Transaktionen durchführen, z. B. das Hinzufügen, Entfernen oder Ersetzen eines Fragments. In deinem FragmentActivity kannst du eine Instanz des FragmentManager, kann zum Erstellen einer FragmentTransaction verwendet werden. Dann können Sie Ihre Fragment innerhalb der onCreate()-Methode Ihrer Aktivität mithilfe von FragmentTransaction.add(), Übergeben der ID ViewGroup des Containers in Ihrem Layout und im Fragment Klasse, die Sie hinzufügen möchten, und führen Sie dann einen Commit der Transaktion durch, wie in der folgendes Beispiel:

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 gleich null ist. So wird sichergestellt, dass das Fragment wird nur einmal beim Erstellen der Aktivität hinzugefügt. Wenn ein erfolgt eine Konfigurationsänderung und die Aktivität wird neu erstellt. savedInstanceState ist nicht mehr null und das Fragment muss nicht wird ein zweites Mal hinzugefügt, da das Fragment automatisch wiederhergestellt wird von savedInstanceState.

Wenn für das Fragment anfängliche Daten erforderlich sind, können Argumente an das Fragment übergeben werden, indem im Aufruf von FragmentTransaction.add() ein Bundle angegeben wird, wie unten gezeigt:

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 aus Ihrem Fragment abgerufen werden, indem Anrufen requireArguments(), Die entsprechenden Bundle-Getter-Methoden können verwendet werden, für jedes Argument.

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

Transaktionen zu Fragment und FragmentManager werden ausführlicher behandelt. im Fragment-Manager-Leitfaden.