Créer un fragment

Un segment représente une partie modulaire de l'interface utilisateur au sein d'une activité. Un fragment possède son propre cycle de vie et reçoit ses propres événements d'entrée. Vous pouvez ajouter ou supprimer des fragments pendant l'exécution de l'activité associée.

Ce document explique comment créer un fragment et l'inclure dans une activité.

Configurer votre environnement

Les fragments nécessitent une dépendance à la bibliothèque de fragments AndroidX. Vous devez ajouter le dépôt Google Maven au fichier settings.gradle de votre projet pour inclure cette dépendance.

Groovy

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

Kotlin

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

Pour inclure la bibliothèque de fragments AndroidX à votre projet, ajoutez les dépendances suivantes dans le fichier build.gradle de votre application :

Groovy

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")
}

Créer une classe de fragment

Pour créer un fragment, développez la classe Fragment d'AndroidX et ignorez ses méthodes pour insérer votre logique d'application, comme vous le feriez pour créer une classe Activity. Pour créer un fragment minimal qui définit sa propre mise en page, fournissez la ressource de mise en page de votre fragment au constructeur de base, comme illustré dans l'exemple suivant :

Kotlin

class ExampleFragment : Fragment(R.layout.example_fragment)

Java

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }
}

La bibliothèque de fragments fournit également des classes de base de fragment plus spécialisées :

DialogFragment
Affiche une boîte de dialogue flottante. L'utilisation de cette classe pour créer une boîte de dialogue est une bonne alternative aux méthodes d'assistance de boîte de dialogue de la classe Activity, car les fragments gèrent automatiquement la création et le nettoyage de Dialog. Pour en savoir plus, consultez Afficher des boîtes de dialogue avec DialogFragment.
PreferenceFragmentCompat
Affiche une hiérarchie d'objets Preference sous forme de liste. PreferenceFragmentCompat vous permet de créer un écran de paramètres pour votre application.

Ajouter un fragment à une activité

Généralement, votre fragment doit être intégré dans une FragmentActivity AndroidX pour contribuer à la mise en page de cette activité dans une partie de l'interface utilisateur. FragmentActivity est la classe de base de AppCompatActivity. Par conséquent, si vous sous-classez déjà AppCompatActivity pour offrir une rétrocompatibilité dans votre application, vous n'avez pas besoin de modifier la classe de base de votre activité.

Vous pouvez ajouter votre fragment à la hiérarchie des vues de votre activité en le définissant dans le fichier de mise en page de votre activité ou en définissant un conteneur de fragment dans le fichier de mise en page de votre activité, puis en ajoutant le fragment de façon programmatique depuis votre activité. Dans les deux cas, vous devez ajouter une FragmentContainerView qui définit l'emplacement où le fragment doit être placé dans la hiérarchie des vues de l'activité. Nous vous recommandons vivement de toujours utiliser FragmentContainerView comme conteneur pour les fragments, car FragmentContainerView inclut des correctifs propres aux fragments, que les autres groupes de vues tels que FrameLayout ne fournissent pas.

Ajouter un fragment via XML

Pour ajouter un fragment de manière déclarative au code XML de mise en page de votre activité, utilisez un élément FragmentContainerView.

Voici un exemple de mise en page d'activité contenant un seul élément 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" />

L'attribut android:name spécifie le nom de classe du Fragment à instancier. Lorsque la mise en page de l'activité est gonflée, le fragment spécifié est instancié, onInflate() est appelé sur le fragment instancié, et une FragmentTransaction est créée pour ajouter le fragment à FragmentManager.

Ajouter un fragment de façon programmatique

Pour ajouter un fragment à la mise en page de votre activité de façon programmatique, la mise en page doit inclure une FragmentContainerView servant de conteneur de fragment, comme illustré dans l'exemple suivant :

<!-- 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" />

Contrairement à l'approche XML, l'attribut android:name n'est pas utilisé ici dans FragmentContainerView. Par conséquent, aucun fragment spécifique n'est automatiquement instancié. Une FragmentTransaction permet d'instancier un fragment et de l'ajouter à la mise en page de l'activité.

Pendant l'exécution de votre activité, vous pouvez effectuer des transactions de fragment (par exemple, ajouter, supprimer ou remplacer un fragment). Dans votre FragmentActivity, vous pouvez obtenir une instance de FragmentManager, qui peut être utilisée pour créer une FragmentTransaction. Vous pouvez ensuite instancier votre fragment dans la méthode onCreate() de votre activité à l'aide de FragmentTransaction.add(), en transmettant l'ID ViewGroup du conteneur dans votre mise en page, ainsi que la classe de fragment que vous souhaitez ajouter, puis en validant la transaction, comme illustré dans l'exemple suivant :

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();
        }
    }
}

Dans l'exemple précédent, notez que la transaction de fragment n'est créée que lorsque savedInstanceState est défini sur null. Cela permet de s'assurer que le fragment n'est ajouté qu'une seule fois lors de la création de l'activité. Lorsqu'une modification de configuration se produit et que l'activité est recréée, savedInstanceState n'est plus null, et le fragment n'a pas besoin d'être ajouté une deuxième fois, car il est automatiquement restauré à partir de savedInstanceState.

Si votre fragment nécessite des données initiales, vous pouvez transmettre des arguments à votre fragment en fournissant un Bundle dans l'appel de FragmentTransaction.add(), comme indiqué ci-dessous :

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();
        }
    }
}

Les arguments Bundle peuvent ensuite être récupérés depuis votre fragment en appelant requireArguments(). Vous pouvez alors utiliser les méthodes getter Bundle appropriées pour récupérer chaque 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");
        ...
    }
}

Voir aussi

Les transactions de fragment et le FragmentManager sont traités plus en détail dans le guide du gestionnaire de fragments.