Fragment reprezentuje modułową część użytkownika w ramach działania. Fragment ma własny cykl życia, otrzymuje swój własnych zdarzeń wejściowych, a także dodawać i usuwać fragmenty, jest w toku.
Ten dokument opisuje, jak utworzyć fragment i uwzględnić go w działaniu.
Skonfiguruj środowisko
Fragmenty wymagają zależności od tagu
Biblioteka fragmentów AndroidaX Czynności, które musisz wykonać
dodaj repozytorium Google Maven.
do pliku settings.gradle
projektu, aby uwzględnić tę zależność.
Odlotowe
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() ... } }
Aby uwzględnić w swoim projekcie bibliotekę fragmentów AndroidX, dodaj:
zależności w pliku build.gradle
aplikacji:
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") }
Tworzenie klasy fragmentu
Aby utworzyć fragment, rozszerz AndroidaX
Fragment
i zastąp
wstawia logikę aplikacji, podobnie jak
zajęcia Activity
. Aby utworzyć minimalną
fragment określający własny układ, podaj zasób układu Twojego fragmentu
do konstruktora podstawowego, jak w tym przykładzie:
Kotlin
class ExampleFragment : Fragment(R.layout.example_fragment)
Java
class ExampleFragment extends Fragment { public ExampleFragment() { super(R.layout.example_fragment); } }
Biblioteka Fragment zawiera też bardziej specjalistyczne klasy bazowe fragmentów:
DialogFragment
- Wyświetla pływające okno. Warto użyć tych zajęć do utworzenia okna,
to alternatywa dla metod pomocniczych w oknie
Activity
klasa jako fragmenty automatycznie obsługuje tworzenie i czyszczenieDialog
. Patrz Wyświetlanie okien, w których jestDialogFragment
aby dowiedzieć się więcej. PreferenceFragmentCompat
- Wyświetla hierarchię:
Preference
jako z listy. Za pomocą usługiPreferenceFragmentCompat
możesz: utworzyć ekran ustawień aplikacji.
Dodawanie fragmentu do aktywności
Ogólnie fragment musi być osadzony w AndroidX
FragmentActivity
do
elementów interfejsu użytkownika
do układu danego działania. FragmentActivity
to klasa bazowa dla argumentu
AppCompatActivity
,
więc jeśli już podklasyfikujesz AppCompatActivity
, aby podać wstecz
zgodność z aplikacją, nie musisz zmieniać ustawień aktywności.
klasę bazową.
Możesz dodać fragment do hierarchii widoku aktywności:
przez zdefiniowanie fragmentu w pliku układu aktywności lub zdefiniowanie elementu
kontenera fragmentów w pliku układu aktywności,
automatyczne dodanie fragmentu z poziomu aktywności. W obu przypadkach
aby dodać
FragmentContainerView
określającą lokalizację, w której należy umieścić dany fragment
w hierarchii widoków aktywności. Zdecydowanie zalecamy użycie tagu
FragmentContainerView
jako kontenera na fragmenty,
FragmentContainerView
zawiera poprawki fragmentów, które inne
nie zapewniają grup widoków danych, takich jak FrameLayout
.
Dodaj fragment za pomocą kodu XML
Aby deklaratywnie dodać fragment do kodu XML układu aktywności, użyj
FragmentContainerView
element.
Oto przykładowy układ aktywności zawierający
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" />
Atrybut android:name
określa nazwę klasy klasy Fragment
do
utworzyć instancję. Gdy układ aktywności jest powiększony, określony fragment
jest tworzony,
onInflate()
dla nowo utworzonego fragmentu, a funkcja FragmentTransaction
aby dodać fragment do FragmentManager
.
Automatyczne dodawanie fragmentu
Aby automatycznie dodać fragment do układu aktywności,
powinien zawierać element FragmentContainerView
, który będzie pełnił funkcję kontenera fragmentów,
jak w tym przykładzie:
<!-- 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" />
W przeciwieństwie do metody XML atrybut android:name
nie jest używany w plikach
FragmentContainerView
, więc żaden konkretny fragment nie jest automatycznie
utworzony. Zamiast tego
FragmentTransaction
służy do utworzenia wystąpienia fragmentu i dodania go do układu działania.
Podczas trwania aktywności możesz dokonywać transakcji dotyczących fragmentów, takich jak
dodanie, usunięcie lub zastąpienie fragmentu. W FragmentActivity
możesz
pobierz instancję
FragmentManager
, czyli
można użyć do utworzenia FragmentTransaction
. Następnie możesz utworzyć instancję
fragment w ramach metody onCreate()
aktywności za pomocą
FragmentTransaction.add()
,
przekazywanie identyfikatora ViewGroup
kontenera w układzie i fragmencie
którą chcesz dodać, a następnie zatwierdź transakcję, jak pokazano
następujący przykład:
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(); } } }
Zwróć uwagę, że w poprzednim przykładzie transakcja z fragmentem jest tworzona
gdy savedInstanceState
to null
. W ten sposób zadbasz o to, aby fragment
jest dodawane tylko raz przy pierwszym utworzeniu aktywności. Gdy
nastąpi zmiana konfiguracji i aktywność jest odtwarzana ponownie,
savedInstanceState
nie ma już wartości null
, a fragment nie wymaga
do dodania po raz drugi, ponieważ fragment jest automatycznie przywrócony
z savedInstanceState
.
Jeśli Twój fragment wymaga danych początkowych, można przekazać do niego argumenty, podając w wywołaniu funkcji FragmentTransaction.add()
parametr Bundle
w następujący sposób:
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(); } } }
Argumenty Bundle
można następnie pobrać z poziomu fragmentu przez
połączenia
requireArguments()
,
i odpowiednie metody pobierania Bundle
mogą być używane do pobierania
każdego argumentu.
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"); ... } }
Zobacz również
Transakcje z użyciem fragmentów i FragmentManager
zostały szczegółowo omówione.
w przewodniku po menedżerze fragmentów.