وقتی با استفاده از Kotlin DSL یک اکشن را در گراف ناوبری تعریف میکنید، Navigation یک کلاس NavAction متناظر ایجاد میکند که شامل پیکربندیهای تعریف شده برای آن اکشن، از جمله موارد زیر است:
- مقصد : شناسه منبع مقصد مورد نظر.
- آرگومانهای پیشفرض : یک
android.os.Bundleکه حاوی مقادیر پیشفرض برای مقصد هدف است، در صورت ارائه. - گزینههای ناوبری : گزینههای ناوبری، که به صورت
NavOptionsنمایش داده میشوند. این کلاس شامل تمام پیکربندیهای ویژه برای انتقال به مقصد هدف و بازگشت از آن، از جمله پیکربندی منابع انیمیشن، رفتار pop و اینکه آیا مقصد باید در حالت single top راهاندازی شود یا خیر، میباشد.
گزینههایی با قابلیت نوشتن
به طور پیشفرض، navigate() مقصد جدید شما را به back stack اضافه میکند. میتوانید با ارسال گزینههای ناوبری اضافی به navigate() )nav، رفتار navigate() را تغییر دهید.
شما میتوانید با استفاده از یک لامبدا ساده، یک نمونه از NavOptions ایجاد کنید. آرگومانهایی را که ممکن است به طور صریح به NavOptions.Builder ارسال کنید navigate() ارسال کنید. مثالهای زیر را در نظر بگیرید:
برای مثال، به راهنمای back stack مراجعه کنید تا مثالهایی در مورد نحوه ارسال گزینهها به navigate() در متن ببینید.
گزینههایی با XML
در زیر یک نمودار نمونه متشکل از دو صفحه نمایش به همراه عملی برای حرکت از یکی به دیگری آمده است:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/a">
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
android:label="a"
tools:layout="@layout/a">
<action android:id="@+id/action_a_to_b"
app:destination="@id/b"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>
<fragment android:id="@+id/b"
android:name="com.example.myapplication.FragmentB"
android:label="b"
tools:layout="@layout/b">
<action android:id="@+id/action_b_to_a"
app:destination="@id/a"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
</fragment>
</navigation>
وقتی گراف ناوبری متورم میشود، این اکشنها تجزیه میشوند و اشیاء NavAction مربوطه با پیکربندیهای تعریفشده در گراف تولید میشوند. برای مثال، action_b_to_a به عنوان ناوبری از مقصد b به مقصد a تعریف میشود. این اکشن شامل انیمیشنهایی به همراه رفتار popTo است که تمام مقصدها را از backstack حذف میکند. همه این تنظیمات به عنوان NavOptions ثبت شده و به NavAction متصل میشوند.
برای دنبال کردن این NavAction ، از NavController.navigate() استفاده کنید و شناسه اکشن را به آن ارسال کنید، همانطور که در مثال زیر نشان داده شده است:
navController.navigate(R.id.action_b_to_a)
اعمال گزینهها به صورت برنامهنویسیشده
مثالهای قبلی نحوه تعیین NavOptions را در نمودار ناوبری XML نشان میدهند. با این حال، گزینههای خاص میتوانند بسته به محدودیتهایی که در زمان ساخت ناشناخته هستند، متفاوت باشند. در چنین مواردی، NavOptions باید ایجاد و به صورت برنامهنویسی تنظیم شود، همانطور که در مثال زیر نشان داده شده است:
کاتلین
findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
جاوا
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
این مثال از یک شکل توسعهیافته از navigate() استفاده میکند و شامل آرگومانهای اضافی Bundle و NavOptions است. همه انواع navigate() دارای نسخههای توسعهیافتهای هستند که آرگومان NavOptions را میپذیرند.
همچنین میتوانید NavOptions به صورت برنامهنویسی هنگام پیمایش به لینکهای عمیق ضمنی اعمال کنید:
کاتلین
findNavController().navigate(
deepLinkUri,
navOptions { // Use the Kotlin DSL for building NavOptions
anim {
enter = android.R.animator.fade_in
exit = android.R.animator.fade_out
}
}
)
جاوا
NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
deepLinkUri,
new NavOptions.Builder()
.setEnterAnim(android.R.animator.fade_in)
.setExitAnim(android.R.animator.fade_out)
.build()
);
این نوع از navigate() یک Uri برای لینک عمیق ضمنی و همچنین نمونه NavOptions میگیرد.