Utwórz fragment

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:

Odlotowe

dependencies {
    def fragment_version = "1.8.2"

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

Kotlin

dependencies {
    val fragment_version = "1.8.2"

    // 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 czyszczenie Dialog. Patrz Wyświetlanie okien, w których jest DialogFragment aby dowiedzieć się więcej.
PreferenceFragmentCompat
Wyświetla hierarchię: Preference jako z listy. Za pomocą usługi PreferenceFragmentCompat 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.