التنقّل باستخدام الخيارات

عند تحديد إجراء في الرسم البياني للتنقّل باستخدام Kotlin DSL، تُنشئ ميزة "التنقل" فئة NavAction مقابلة لها تحتوي على إعدادات الضبط المحدَّدة لهذا الإجراء، بما في ذلك ما يلي:

  • الوجهة: رقم تعريف مورّد الوجهة المستهدفة.
  • الوسيطات التلقائية: android.os.Bundle يحتوي على قيم تلقائية للوجهة المستهدفة، في حال توفيرها.
  • خيارات التنقل: خيارات التنقل، ممثلة على شكل NavOptions. تحتوي هذه الفئة على جميع التكوينات الخاصة للانتقال من وإلى الوجهة المستهدفة، بما في ذلك ضبط موارد الصور المتحركة وسلوك الانتقال السريع وما إذا كان ينبغي إطلاق الوجهة في وضع واحد من المستوى الأعلى.

الخيارات مع ميزة الإنشاء

تضيف navigate() تلقائيًا وجهتك الجديدة إلى الحزمة الخلفية. يمكنك تعديل سلوك navigate() من خلال تمرير خيارات تنقّل إضافية إلى طلب الإجراء navigate().

يمكنك إنشاء مثيل NavOptions باستخدام دالة lambda بسيطة. مرِّر navigate() الوسيطات التي يمكنك تمريرها صراحةً إلى NavOptions.Builder. بالنظر إلى الأمثلة التالية:

على سبيل المثال، يمكنك الاطّلاع على دليل الحزمة الخلفية للحصول على أمثلة حول كيفية تمرير الخيارات إلى 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 وإعداده آليًا، كما هو موضّح في المثال التالي:

Kotlin

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
    }
  }
)

Java

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 بشكل آلي عند الانتقال إلى روابط ضمنية لصفحات في التطبيق:

Kotlin

findNavController().navigate(
    deepLinkUri,
    navOptions { // Use the Kotlin DSL for building NavOptions
        anim {
            enter = android.R.animator.fade_in
            exit = android.R.animator.fade_out
        }
    }
)

Java

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.