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

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

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

الخيارات باستخدام Compose

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

يمكنك إنشاء مثيل من NavOptions باستخدام تعبير لامدا بسيط. مرِّر إلى 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.