Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Pour utiliser des éléments partagés avec la dépendance navigation-compose, utilisez le Modifier.sharedElement() qui prend un AnimatedVisibilityScope comme paramètre. Vous pouvez l'utiliser pour déterminer ce qui doit être visible et quand.
Figure 1. Navigation Compose avec des éléments partagés.
Voici un exemple d'utilisation de navigation-compose avec des éléments partagés :
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/08/27 (UTC)."],[],[],null,["To use shared elements with the [`navigation-compose` dependency](/jetpack/compose/navigation), use the\n`Modifier.sharedElement()` that takes an `AnimatedVisibilityScope` as a\nparameter. You can use this to decide what should be visible and when.\n**Figure 1.** Navigation Compose with shared elements.\n\nThe following is an example of using `navigation-compose` with shared elements:\n\n\n```kotlin\n@Preview\n@Composable\nfun SharedElement_PredictiveBack() {\n SharedTransitionLayout {\n val navController = rememberNavController()\n NavHost(\n navController = navController,\n startDestination = \"home\"\n ) {\n composable(\"home\") {\n HomeScreen(\n this@SharedTransitionLayout,\n this@composable,\n { navController.navigate(\"details/$it\") }\n )\n }\n composable(\n \"details/{item}\",\n arguments = listOf(navArgument(\"item\") { type = NavType.IntType })\n ) { backStackEntry -\u003e\n val id = backStackEntry.arguments?.getInt(\"item\")\n val snack = listSnacks[id!!]\n DetailsScreen(\n id,\n snack,\n this@SharedTransitionLayout,\n this@composable,\n {\n navController.navigate(\"home\")\n }\n )\n }\n }\n }\n}\n\n@Composable\nfun DetailsScreen(\n id: Int,\n snack: Snack,\n sharedTransitionScope: SharedTransitionScope,\n animatedContentScope: AnimatedContentScope,\n onBackPressed: () -\u003e Unit\n) {\n with(sharedTransitionScope) {\n Column(\n Modifier\n .fillMaxSize()\n .clickable {\n onBackPressed()\n }\n ) {\n Image(\n painterResource(id = snack.image),\n contentDescription = snack.description,\n contentScale = ContentScale.Crop,\n modifier = Modifier\n .sharedElement(\n sharedTransitionScope.rememberSharedContentState(key = \"image-$id\"),\n animatedVisibilityScope = animatedContentScope\n )\n .aspectRatio(1f)\n .fillMaxWidth()\n )\n Text(\n snack.name, fontSize = 18.sp,\n modifier =\n Modifier\n .sharedElement(\n sharedTransitionScope.rememberSharedContentState(key = \"text-$id\"),\n animatedVisibilityScope = animatedContentScope\n )\n .fillMaxWidth()\n )\n }\n }\n}\n\n@Composable\nfun HomeScreen(\n sharedTransitionScope: SharedTransitionScope,\n animatedContentScope: AnimatedContentScope,\n onItemClick: (Int) -\u003e Unit,\n) {\n LazyColumn(\n modifier = Modifier\n .fillMaxSize()\n .padding(8.dp),\n verticalArrangement = Arrangement.spacedBy(8.dp)\n ) {\n itemsIndexed(listSnacks) { index, item -\u003e\n Row(\n Modifier.clickable {\n onItemClick(index)\n }\n ) {\n Spacer(modifier = Modifier.width(8.dp))\n with(sharedTransitionScope) {\n Image(\n painterResource(id = item.image),\n contentDescription = item.description,\n contentScale = ContentScale.Crop,\n modifier = Modifier\n .sharedElement(\n sharedTransitionScope.rememberSharedContentState(key = \"image-$index\"),\n animatedVisibilityScope = animatedContentScope\n )\n .size(100.dp)\n )\n Spacer(modifier = Modifier.width(8.dp))\n Text(\n item.name, fontSize = 18.sp,\n modifier = Modifier\n .align(Alignment.CenterVertically)\n .sharedElement(\n sharedTransitionScope.rememberSharedContentState(key = \"text-$index\"),\n animatedVisibilityScope = animatedContentScope,\n )\n )\n }\n }\n }\n }\n}\n\ndata class Snack(\n val name: String,\n val description: String,\n @DrawableRes val image: Int\n)https://github.com/android/snippets/blob/dd30aee903e8c247786c064faab1a9ca8d10b46e/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/SharedElementsWithNavigationSnippets.kt#L66-L195\n```\n\n\u003cbr /\u003e\n\nPredictive back with shared elements\n\nTo use [predictive back](/guide/navigation/custom-back/predictive-back-gesture) with shared elements, follow these steps:\n\n1. Use the latest [`navigation-compose` dependency](/develop/ui/compose/navigation), using the snippet from\n the preceding section.\n\n dependencies {\n def nav_version = \"2.8.0-beta02\"\n\n implementation \"androidx.navigation:navigation-compose:$nav_version\"\n }\n\n2. Enable the [Predictive back setting](/guide/navigation/custom-back/predictive-back-gesture#dev-option) in developer options.\n\n3. Add `android:enableOnBackInvokedCallback=\"true\"` to your `AndroidManifest.xml`\n file:\n\n \u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\u003e\n \u003cuses-permission android:name=\"android.permission.INTERNET\" /\u003e\n \u003cuses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /\u003e\n \u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"\n android:maxSdkVersion=\"28\" /\u003e\n\n \u003capplication\n android:allowBackup=\"true\"\n android:icon=\"@mipmap/ic_launcher\"\n android:label=\"@string/app_name\"\n android:roundIcon=\"@mipmap/ic_launcher_round\"\n android:supportsRtl=\"true\"\n android:enableOnBackInvokedCallback=\"true\"\n android:theme=\"@style/Theme.Snippets\"\u003e\n\n**Figure 2.** Navigation Compose with predictive back."]]