Điều hướng bằng các tuỳ chọn

Khi bạn dùng Kotlin DSL để xác định một thao tác trong biểu đồ điều hướng, tính năng Điều hướng (Navigation) sẽ tạo một lớp NavAction tương ứng, trong đó có chứa cấu hình được xác định cho thao tác đó, bao gồm những thông tin sau:

  • Đích đến: Mã tài nguyên của đích đến mục tiêu.
  • Đối số mặc định: android.os.Bundle chứa giá trị mặc định cho đích đến nếu được cung cấp.
  • Tuỳ chọn điều hướng: Tuỳ chọn điều hướng được biểu thị dưới dạng NavOptions. Lớp này chứa toàn bộ cấu hình đặc biệt để chuyển đổi qua lại từ đích đến mục tiêu, bao gồm cả cấu hình tài nguyên của ảnh động, hành vi đẩy ra lẫn việc có nên khởi chạy đích đến ở chế độ trên cùng duy nhất hay không.

Tuỳ chọn dành cho Compose

Theo mặc định, navigate() sẽ thêm đích đến mới của bạn vào ngăn xếp lui. Bạn có thể truyền các tuỳ chọn điều hướng khác vào lệnh gọi navigate() để sửa đổi hành vi của navigate().

Bạn có thể tạo một thực thể của NavOptions bằng một hàm lambda đơn giản. Bạn nên truyền các đối số navigate() mà mình có thể truyền một cách rõ ràng đến NavOptions.Builder. Hãy xem các ví dụ sau:

Bạn có thể đọc hướng dẫn về ngăn xếp lui để tham khảo ví dụ về cách truyền các tuỳ chọn đến navigate() theo bối cảnh.

Tuỳ chọn dành cho XML

Sau đây là biểu đồ mẫu gồm 2 màn hình cùng với thao tác để điều hướng từ màn hình này sang màn hình khác:

<?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>

Khi đồ thị điều hướng được tăng cường, các thao tác này sẽ được phân tích cú pháp và đối tượng NavAction tương ứng sẽ được tạo bằng cấu hình đã xác định trong biểu đồ. Ví dụ: action_b_to_a được xác định sẽ đi theo đường dẫn từ đích b đến a. Tác vụ này bao gồm các ảnh động với hành vi popTo giúp xóa toàn bộ đích đến khỏi ngăn xếp ngược. Tất cả chế độ cài đặt này đều được ghi lại dưới dạng NavOptions và gắn liền với NavAction.

Để tuân theo NavAction này, hãy sử dụng NavController.navigate(), truyền mã thao tác như minh hoạ trong ví dụ sau:

    navController.navigate(R.id.action_b_to_a)

Áp dụng các tuỳ chọn theo phương thức lập trình

Các ví dụ trước cho thấy cách chỉ định NavOptions trong XML của biểu đồ điều hướng. Tuy nhiên, các tuỳ chọn cụ thể có thể thay đổi do có những hạn chế chưa xác định tại thời gian xây dựng. Khi đó, bạn phải tạo và đặt NavOptions theo phương thức lập trình, như minh hoạ trong ví dụ sau:

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()
  );

Ví dụ này dùng dạng navigate() mở rộng, đồng thời có thêm các đối số BundleNavOptions. Mọi biến thể của navigate() đều có phiên bản mở rộng chấp nhận đối số NavOptions.

Ngoài ra, bạn còn có thể áp dụng NavOptions theo phương thức lập trình khi điều hướng đến đường liên kết sâu ngầm ẩn:

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()
);

Biến thể này của navigate() sẽ tiếp nhận Uri cho đường liên kết sâu ngầm ẩn, cũng như thực thể NavOptions.