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.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") }
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 deDialog
. Pour en savoir plus, consultez Afficher des boîtes de dialogue avecDialogFragment
. 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.