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.3" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.8.3" // 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 dieDialog
automatisch. Weitere Informationen finden Sie unter Dialogfelder mitDialogFragment
anzeigen. . PreferenceFragmentCompat
- Zeigt eine Hierarchie von
Preference
-Objekte als Liste. MitPreferenceFragmentCompat
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.