پیمایش با گزینه‌ها

وقتی کنشی را در نمودار پیمایش بااستفاده از Kotlin DSL تعریف می‌کنید، «پیمایش» کلاس NavAction متناظری را تولید می‌کند که حاوی پیکربندی‌های تعریف‌شده برای آن کنش است، ازجمله موارد زیر:

  • مقصد: شناسه منبع مقصد هدف.
  • متغیرهای مستقل پیش‌فرض: یک android.os.Bundle حاوی مقادیر پیش‌فرض برای مقصد هدف، درصورت ارائه.
  • گزینه‌های پیمایش: گزینه‌های پیمایش، که به‌صورت NavOptions نشان داده می‌شود. این کلاس شامل همه پیکربندی‌های ویژه برای انتقال به مقصد هدف و برگشت از آن است، ازجمله پیکربندی منبع پویانمایی، رفتار پاپ، و اینکه آیا مقصد باید در حالت تک‌بالا راه‌اندازی شود یا نه.

گزینه‌های «نوشتن»

به‌طور پیش‌فرض، navigate() مقصد جدیدتان را به پشته قبلی‌ها اضافه می‌کند. می‌توانید رفتار navigate() را با ارسال گزینه‌های پیمایش اضافی به تماس navigate() خود تغییر دهید.

می‌توانید بااستفاده از یک لامبدا ساده، نمونه‌ای از NavOptions ایجاد کنید. متغیرهای مستقل را که ممکن است به‌طور صریح به NavOptions.Builder ارسال کنید، ارسال کنید navigate(). مثال‌های زیر را درنظر بگیرید:

برای مثال، به راهنمای پشته قبلی‌ها مراجعه کنید تا مثال‌هایی از نحوه ارسال گزینه‌ها به 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 است که همه مقصدها را از پشته برگشت برمی‌دارد. همه این تنظیمات به‌عنوان 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 می‌گیرد.