مولفه Navigation یک راه ساده و عمومی برای پیمایش به مقصد ارائه می دهد. این رابط از طیف وسیعی از زمینه ها و چارچوب های UI پشتیبانی می کند. برای مثال، میتوانید از مؤلفه Navigation با Compose، نماها، قطعات، فعالیتها و حتی چارچوبهای سفارشی UI استفاده کنید.
این راهنما توضیح می دهد که چگونه می توانید از مؤلفه ناوبری برای پیمایش به مقصد در زمینه های مختلف استفاده کنید.
از NavController استفاده کنید
نوع کلیدی که برای جابجایی بین مقصد استفاده می کنید NavController
است. برای اطلاعات بیشتر در مورد خود کلاس و نحوه ایجاد یک نمونه از آن ، به ایجاد یک کنترل کننده ناوبری مراجعه کنید. این راهنما نحوه استفاده از آن را توضیح می دهد.
پیمایش کنید
صرف نظر از اینکه از کدام چارچوب UI استفاده می کنید، یک تابع واحد وجود دارد که می توانید برای پیمایش به مقصد از آن استفاده کنید: NavController.navigate()
.
اضافه بارهای زیادی برای navigate()
موجود است. اضافه باری که باید انتخاب کنید با زمینه دقیق شما مطابقت دارد. به عنوان مثال، هنگام پیمایش به یک Composable باید از یک اضافه بار استفاده کنید و هنگام پیمایش به یک View از دیگری استفاده کنید.
بخشهای زیر برخی از کلیدهای navigate()
را که میتوانید استفاده کنید، تشریح میکند.
به یک کامپوزیشن پیمایش کنید
برای پیمایش به یک composable، باید از NavController.navigate<T>
استفاده کنید. با این اضافه بار، navigate()
یک آرگومان route
واحد می گیرد که برای آن یک نوع ارسال می کنید. به عنوان کلید یک مقصد عمل می کند.
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
برای پیمایش به یک Composable در نمودار ناوبری، ابتدا NavGraph
خود را طوری تعریف کنید که هر مقصد با یک نوع مطابقت داشته باشد . برای composable ها، این کار را با تابع composable()
انجام می دهید.
رویدادها را از اجزای سازنده خود افشا کنید
هنگامی که یک تابع composable نیاز به پیمایش به یک صفحه جدید دارد، نباید آن را به عنوان مرجع به NavController
ارسال کنید تا بتواند مستقیماً navigate()
فراخوانی کند. طبق اصول جریان دادههای یکطرفه (UDF) ، ترکیبپذیر باید رویدادی را که NavController
مدیریت میکند، نشان دهد.
به عبارت مستقیم تر، composable شما باید پارامتری از نوع () -> Unit
داشته باشد. هنگامی که با تابع composable()
مقصدهایی را به NavHost
خود اضافه می کنید، یک فراخوانی را به NavController.navigate()
ارسال کنید.
برای نمونه ای از این موضوع به زیربخش زیر مراجعه کنید.
مثال
به عنوان نمونه ای از بخش های قبل، این نکات را در قطعه زیر مشاهده کنید:
- هر مقصد در نمودار با استفاده از یک مسیر ایجاد می شود که یک شی یا کلاس قابل سریال سازی است که داده های مورد نیاز آن مقصد را توصیف می کند.
-
MyAppNavHost
composable نمونهNavController
را نگه می دارد. - بر این اساس، فراخوانی برای
navigate()
باید در آنجا اتفاق بیفتد و نه در یک ترکیب بندی پایین تر مانندProfileScreen
. -
ProfileScreen
حاوی دکمه ای است که کاربر را با کلیک کردن بهFriendsList
هدایت می کند. با این حال، خودnavigate()
فراخوانی نمی کند. - در عوض، دکمه تابعی را فراخوانی میکند که به عنوان پارامتر
onNavigateToFriends
نمایش داده میشود. - وقتی
MyAppNavHost
ProfileScreen
به نمودار ناوبری اضافه می کند، برایonNavigateToFriends
یک لامبدا ارسال می کند کهnavigate(route = FriendsList
) را فراخوانی می کند. - این تضمین می کند که وقتی کاربر دکمه
ProfileScreen
فشار می دهد، به درستی بهFriendsListScreen
هدایت می شود.
@Serializable
object Profile
@Serializable
object FriendsList
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = Profile
) {
composable<Profile> {
ProfileScreen(
onNavigateToFriends = { navController.navigate(route = FriendsList) },
/*...*/
)
}
composable<FriendsList> { FriendsListScreen(/*...*/) }
}
}
@Composable
fun ProfileScreen(
onNavigateToFriends: () -> Unit,
/*...*/
) {
/*...*/
Button(onClick = onNavigateToFriends) {
Text(text = "See friends list")
}
}
با استفاده از شناسه عدد صحیح پیمایش کنید
برای پیمایش به مقصد با استفاده از شناسه عدد صحیح، بیش از حد navigate(int)
فراخوانی کنید. شناسه منبع یک اقدام یا مقصد را می گیرد. قطعه کد زیر نشان می دهد که چگونه می توانید از این اضافه بار برای پیمایش به ViewTransactionsFragment
استفاده کنید:
کاتلین
viewTransactionsButton.setOnClickListener { view ->
view.findNavController().navigate(R.id.viewTransactionsAction)
}
جاوا
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
}
});
هنگام پیمایش با استفاده از شناسهها، باید در صورت امکان از اقدامات استفاده کنید. کنشها اطلاعات بیشتری را در نمودار پیمایش شما ارائه میدهند، و به صورت بصری نحوه اتصال مقاصد شما به یکدیگر را نشان میدهند.
با استفاده از NavDeepLinkRequest پیمایش کنید
برای پیمایش به مقصد پیوند عمیق ضمنی ، از navigate(NavDeepLinkRequest)
استفاده کنید. قطعه زیر پیاده سازی این روش را ارائه می دهد:
کاتلین
val request = NavDeepLinkRequest.Builder
.fromUri("android-app://androidx.navigation.app/profile".toUri())
.build()
findNavController().navigate(request)
جاوا
NavDeepLinkRequest request = NavDeepLinkRequest.Builder
.fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
.build()
NavHostFragment.findNavController(this).navigate(request)
برخلاف پیمایش با استفاده از شناسههای کنش یا مقصد، میتوانید بدون در نظر گرفتن اینکه مقصد قابل مشاهده است به هر پیوند عمیق در نمودار خود بروید. می توانید به مقصدی در نمودار فعلی یا مقصدی در نمودار کاملاً متفاوت حرکت کنید.
اقدامات و انواع MIME
علاوه بر Uri
، NavDeepLinkRequest
از پیوندهای عمیق با اکشن ها و انواع MIME نیز پشتیبانی می کند. برای افزودن یک اقدام به درخواست، fromAction()
یا setAction()
استفاده کنید. برای افزودن نوع MIME به درخواست، fromMimeType()
یا setMimeType()
استفاده کنید.
برای اینکه NavDeepLinkRequest
به درستی با مقصد پیوند عمیق ضمنی مطابقت داشته باشد، نوع URI، اقدام و MIME باید با NavDeepLink
در مقصد مطابقت داشته باشد. URI ها باید با الگو مطابقت داشته باشند، اقدامات باید دقیقاً مطابقت داشته باشند، و انواع MIME باید مرتبط باشند. برای مثال، image/jpg
با image/\*
مطابقت دارد
زمینه های بیشتر
این سند نحوه استفاده از NavController.navigate()
در رایج ترین موارد استفاده را پوشش می دهد. با این حال، این تابع دارای طیف وسیعی از اضافهبارها است که میتوانید در زمینههای مختلف و همراه با هر چارچوب رابط کاربری از آنها استفاده کنید. برای جزئیات بیشتر در مورد این اضافه بارها به مستندات مرجع مراجعه کنید.
در ادامه مطلب
برای اطلاعات بیشتر به صفحات زیر مراجعه کنید:
- یک کنترل کننده ناوبری ایجاد کنید
- ناوبری و پشته پشته
- با گزینه ها پیمایش کنید
- ایمنی را در Kotlin DSL و Navigation Compose تایپ کنید
مولفه ناوبری یک راه ساده و عمومی برای پیمایش به مقصد ارائه می دهد. این رابط از طیف وسیعی از زمینه ها و چارچوب های UI پشتیبانی می کند. برای مثال، میتوانید از مؤلفه Navigation با Compose، نماها، قطعات، فعالیتها و حتی چارچوبهای سفارشی UI استفاده کنید.
این راهنما توضیح می دهد که چگونه می توانید از مؤلفه ناوبری برای پیمایش به مقصد در زمینه های مختلف استفاده کنید.
از NavController استفاده کنید
نوع کلیدی که برای جابجایی بین مقصد استفاده می کنید NavController
است. برای اطلاعات بیشتر در مورد خود کلاس و نحوه ایجاد یک نمونه از آن ، به ایجاد یک کنترل کننده ناوبری مراجعه کنید. این راهنما نحوه استفاده از آن را توضیح می دهد.
پیمایش کنید
صرف نظر از اینکه از کدام چارچوب UI استفاده می کنید، یک تابع واحد وجود دارد که می توانید برای پیمایش به مقصد از آن استفاده کنید: NavController.navigate()
.
اضافه بارهای زیادی برای navigate()
موجود است. اضافه باری که باید انتخاب کنید با زمینه دقیق شما مطابقت دارد. به عنوان مثال، هنگام پیمایش به یک Composable باید از یک اضافه بار استفاده کنید و هنگام پیمایش به یک View از دیگری استفاده کنید.
بخشهای زیر برخی از کلیدهای navigate()
را که میتوانید استفاده کنید، تشریح میکند.
به یک کامپوزیشن پیمایش کنید
برای پیمایش به یک composable، باید از NavController.navigate<T>
استفاده کنید. با این اضافه بار، navigate()
یک آرگومان route
واحد می گیرد که برای آن یک نوع ارسال می کنید. به عنوان کلید یک مقصد عمل می کند.
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
برای پیمایش به یک Composable در نمودار ناوبری، ابتدا NavGraph
خود را طوری تعریف کنید که هر مقصد با یک نوع مطابقت داشته باشد . برای composable ها، این کار را با تابع composable()
انجام می دهید.
رویدادها را از اجزای سازنده خود افشا کنید
هنگامی که یک تابع composable نیاز به پیمایش به یک صفحه جدید دارد، نباید آن را به عنوان مرجع به NavController
ارسال کنید تا بتواند مستقیماً navigate()
فراخوانی کند. طبق اصول جریان دادههای یکطرفه (UDF) ، ترکیبپذیر باید رویدادی را که NavController
مدیریت میکند، نشان دهد.
به عبارت مستقیم تر، composable شما باید پارامتری از نوع () -> Unit
داشته باشد. هنگامی که با تابع composable()
مقصدهایی را به NavHost
خود اضافه می کنید، یک فراخوانی را به NavController.navigate()
ارسال کنید.
برای نمونه ای از این موضوع به زیربخش زیر مراجعه کنید.
مثال
به عنوان نمونه ای از بخش های قبل، این نکات را در قطعه زیر مشاهده کنید:
- هر مقصد در نمودار با استفاده از یک مسیر ایجاد می شود که یک شی یا کلاس قابل سریال سازی است که داده های مورد نیاز آن مقصد را توصیف می کند.
-
MyAppNavHost
composable نمونهNavController
را نگه می دارد. - بر این اساس، فراخوانی برای
navigate()
باید در آنجا اتفاق بیفتد و نه در یک ترکیب بندی پایین تر مانندProfileScreen
. -
ProfileScreen
حاوی دکمه ای است که کاربر را با کلیک کردن بهFriendsList
هدایت می کند. با این حال، خودnavigate()
فراخوانی نمی کند. - در عوض، دکمه تابعی را فراخوانی میکند که به عنوان پارامتر
onNavigateToFriends
نمایش داده میشود. - وقتی
MyAppNavHost
ProfileScreen
به نمودار ناوبری اضافه می کند، برایonNavigateToFriends
یک لامبدا ارسال می کند کهnavigate(route = FriendsList
) را فراخوانی می کند. - این تضمین می کند که وقتی کاربر دکمه
ProfileScreen
فشار می دهد، به درستی بهFriendsListScreen
هدایت می شود.
@Serializable
object Profile
@Serializable
object FriendsList
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = Profile
) {
composable<Profile> {
ProfileScreen(
onNavigateToFriends = { navController.navigate(route = FriendsList) },
/*...*/
)
}
composable<FriendsList> { FriendsListScreen(/*...*/) }
}
}
@Composable
fun ProfileScreen(
onNavigateToFriends: () -> Unit,
/*...*/
) {
/*...*/
Button(onClick = onNavigateToFriends) {
Text(text = "See friends list")
}
}
با استفاده از شناسه عدد صحیح پیمایش کنید
برای پیمایش به مقصد با استفاده از شناسه عدد صحیح، بیش از حد navigate(int)
فراخوانی کنید. شناسه منبع یک اقدام یا مقصد را می گیرد. قطعه کد زیر نشان می دهد که چگونه می توانید از این اضافه بار برای پیمایش به ViewTransactionsFragment
استفاده کنید:
کاتلین
viewTransactionsButton.setOnClickListener { view ->
view.findNavController().navigate(R.id.viewTransactionsAction)
}
جاوا
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
}
});
هنگام پیمایش با استفاده از شناسهها، باید در صورت امکان از اقدامات استفاده کنید. کنشها اطلاعات بیشتری را در نمودار پیمایش شما ارائه میدهند، و به صورت بصری نحوه اتصال مقاصد شما به یکدیگر را نشان میدهند.
با استفاده از NavDeepLinkRequest پیمایش کنید
برای پیمایش به مقصد پیوند عمیق ضمنی ، از navigate(NavDeepLinkRequest)
استفاده کنید. قطعه زیر پیاده سازی این روش را ارائه می دهد:
کاتلین
val request = NavDeepLinkRequest.Builder
.fromUri("android-app://androidx.navigation.app/profile".toUri())
.build()
findNavController().navigate(request)
جاوا
NavDeepLinkRequest request = NavDeepLinkRequest.Builder
.fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
.build()
NavHostFragment.findNavController(this).navigate(request)
برخلاف پیمایش با استفاده از شناسههای کنش یا مقصد، میتوانید بدون در نظر گرفتن اینکه مقصد قابل مشاهده است به هر پیوند عمیق در نمودار خود بروید. می توانید به مقصدی در نمودار فعلی یا مقصدی در نمودار کاملاً متفاوت حرکت کنید.
اقدامات و انواع MIME
علاوه بر Uri
، NavDeepLinkRequest
از پیوندهای عمیق با اکشن ها و انواع MIME نیز پشتیبانی می کند. برای افزودن یک اقدام به درخواست، fromAction()
یا setAction()
استفاده کنید. برای افزودن نوع MIME به درخواست، fromMimeType()
یا setMimeType()
استفاده کنید.
برای اینکه NavDeepLinkRequest
به درستی با مقصد پیوند عمیق ضمنی مطابقت داشته باشد، نوع URI، اقدام و MIME باید با NavDeepLink
در مقصد مطابقت داشته باشد. URI ها باید با الگو مطابقت داشته باشند، اقدامات باید دقیقاً مطابقت داشته باشند، و انواع MIME باید مرتبط باشند. برای مثال، image/jpg
با image/\*
مطابقت دارد
زمینه های بیشتر
این سند نحوه استفاده از NavController.navigate()
در رایج ترین موارد استفاده را پوشش می دهد. با این حال، این تابع دارای طیف وسیعی از اضافهبارها است که میتوانید در زمینههای مختلف و همراه با هر چارچوب رابط کاربری از آنها استفاده کنید. برای جزئیات بیشتر در مورد این اضافه بارها به مستندات مرجع مراجعه کنید.
در ادامه مطلب
برای اطلاعات بیشتر به صفحات زیر مراجعه کنید:
- یک کنترل کننده ناوبری ایجاد کنید
- ناوبری و پشته پشته
- با گزینه ها پیمایش کنید
- ایمنی را در Kotlin DSL و Navigation Compose تایپ کنید