ניווט עם אפשרויות

כשמגדירים פעולה בתרשים הניווט באמצעות 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 של התרשים. עם זאת, אפשרויות ספציפיות עשויות להשתנות בהתאם למגבלות לא ידוע בזמן ה-build. במקרים כאלה, צריך ליצור ולהגדיר את 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.