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

כשמגדירים פעולה בתרשים הניווט באמצעות Kotlin DSL,‏ Navigation יוצר מחלקה תואמת של NavAction, שמכילה את ההגדרות שהוגדרו לפעולה הזו, כולל:

  • יעד: מזהה המשאב של יעד היעד.
  • ארגומנטים של ברירת מחדל: android.os.Bundle שמכיל ערכי ברירת מחדל ליעד, אם צוינו.
  • אפשרויות ניווט: אפשרויות ניווט, שמיוצגות כ-NavOptions. המחלקות האלה מכילות את כל ההגדרות המיוחדות למעבר אל יעד היעד וחזרה ממנו, כולל הגדרות של משאבי אנימציה, התנהגות של חלונות קופצים והאם היעד צריך להיפתח במצב של חלון יחיד בחלק העליון.

אפשרויות בכתיבה

כברירת מחדל, navigate() מוסיף את היעד החדש למקבץ הפעילויות הקודמות (back stack). אפשר לשנות את ההתנהגות של navigate() על ידי העברת אפשרויות ניווט נוספות לקריאה ל-navigate().

אפשר ליצור מופע של NavOptions באמצעות lambda פשוטה. מעבירים ל-navigate() את הארגומנטים שאחרת הייתם מעבירים באופן מפורש ל-NavOptions.Builder. מומלץ להביא בחשבון את הדוגמאות הבאות:

דוגמאות להעברת אפשרויות אל navigate() בהקשר מופיעות במדריך לשימוש במקבץ פעילויות קודמות (back stack).

אפשרויות עם 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.