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ố Bundle
và NavOptions
. 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
.