Thành phần Điều hướng cung cấp một cách thức chung và đơn giản để điều hướng tới một đích đến. Giao diện này hỗ trợ nhiều ngữ cảnh và khung giao diện người dùng. Ví dụ: bạn có thể sử dụng thành phần Điều hướng với Compose, Thành phần hiển thị, Mảnh, Hoạt động và thậm chí cả các khung giao diện người dùng tuỳ chỉnh.
Hướng dẫn này mô tả cách bạn có thể sử dụng thành phần Điều hướng để điều hướng tới một đích đến trong nhiều ngữ cảnh.
Sử dụng một NavController
Loại khoá bạn dùng để điều hướng giữa các đích đến là NavController
.
Xem nội dung Tạo trình điều khiển điều hướng để biết thêm thông tin về lớp đó và cách tạo thực thể tương ứng. Hướng dẫn này trình bày chi tiết về cách sử dụng trình điều khiển điều hướng.
Điều hướng
Bất kể đang dùng khung giao diện người dùng nào, bạn đều có thể sử dụng một hàm duy nhất để điều hướng tới một đích đến: NavController.navigate()
.
Có nhiều phương thức nạp chồng cho navigate()
. Bạn nên chọn phương thức nạp chồng tương ứng với ngữ cảnh chính xác của mình. Ví dụ: bạn nên sử dụng một phương thức nạp chồng khi điều hướng đến một thành phần kết hợp và dùng một phương thức khác khi điều hướng đến một khung hiển thị.
Các phần sau đây trình bày một số phương thức nạp chồng navigate()
chính mà bạn có thể sử dụng
sử dụng.
Điều hướng đến một thành phần kết hợp
Để chuyển đến một thành phần kết hợp, bạn nên sử dụng NavController.navigate<T>
.
Với phương thức nạp chồng này, navigate()
sẽ lấy một đối số route
duy nhất mà bạn
truyền một loại. Đối số này đóng vai trò như chìa khoá cho một đích đến.
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
Để chuyển đến một thành phần kết hợp trong biểu đồ điều hướng, trước tiên, hãy xác định
NavGraph
sao cho mỗi đích đến tương ứng với một loại. Cho
thành phần kết hợp, bạn có thể làm như vậy bằng hàm composable()
.
Hiện sự kiện từ các thành phần kết hợp
Khi một hàm có khả năng kết hợp cần chuyển đến một màn hình mới, bạn không nên truyền mục tham chiếu đến NavController
để nó có thể trực tiếp gọi navigate()
.
Theo nguyên tắc Luồng dữ liệu một chiều (UDF), thành phần kết hợp phải hiện một sự kiện mà NavController
xử lý.
Nói một cách trực tiếp hơn, thành phần kết hợp sẽ có một tham số thuộc kiểu () -> Unit
.
Khi bạn thêm đích đến vào NavHost
bằng hàm composable()
, hãy truyền cho thành phần kết hợp một lệnh gọi đến NavController.navigate()
.
Hãy xem tiểu mục sau đây để biết ví dụ về trường hợp này.
Ví dụ
Để xem thông tin minh hoạ cho các phần trước, hãy quan sát những điểm sau trong đoạn mã sau:
- Mỗi đích đến trong biểu đồ được tạo bằng cách sử dụng một tuyến đường, đối tượng hoặc lớp có thể chuyển đổi tuần tự mô tả dữ liệu mà công cụ đó yêu cầu đích.
- Thành phần kết hợp
MyAppNavHost
chứa thực thểNavController
. - Theo đó, các lệnh gọi đến
navigate()
sẽ xảy ra ở đó chứ không phải trong một thành phần kết hợp thấp hơn nhưProfileScreen
. ProfileScreen
chứa một nút điều hướng người dùng đếnFriendsList
khi được nhấp vào. Tuy nhiên, nút này sẽ không gọi chínhnavigate()
.- Thay vào đó, nút này sẽ gọi một hàm hiển thị dưới dạng tham số
onNavigateToFriends
. - Khi
MyAppNavHost
thêmProfileScreen
vào biểu đồ điều hướng, đối vớionNavigateToFriends
sẽ truyền một hàm lambda gọinavigate(route = FriendsList
). - Điều này đảm bảo rằng khi người dùng nhấn nút
ProfileScreen
, họ sẽ di chuyển chính xác đếnFriendsListScreen
.
@Serializable
object Profile
@Serializable
object FriendsList
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = Profile
) {
composable<Profile> {
ProfileScreen(
onNavigateToFriends = { navController.navigate(route = FriendsList) },
/*...*/
)
}
composable<FriendsList> { FriendsListScreen(/*...*/) }
}
}
@Composable
fun ProfileScreen(
onNavigateToFriends: () -> Unit,
/*...*/
) {
/*...*/
Button(onClick = onNavigateToFriends) {
Text(text = "See friends list")
}
}
Điều hướng bằng mã nhận dạng số nguyên
Để điều hướng một đích đến bằng mã nhận dạng số nguyên, hãy gọi phương thức nạp chồng navigate(int)
. Phương thức này lấy mã nhận dạng tài nguyên của một tác vụ hoặc một đích đến. Đoạn mã sau đây cho biết cách bạn có thể sử dụng phương thức nạp chồng này để điều hướng đến ViewTransactionsFragment
:
Kotlin
viewTransactionsButton.setOnClickListener { view ->
view.findNavController().navigate(R.id.viewTransactionsAction)
}
Java
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
}
});
Khi điều hướng bằng mã nhận dạng, bạn nên sử dụng các thao tác nếu có thể. Các thao tác cung cấp thêm thông tin trong biểu đồ điều hướng, cho thấy cách các đích đến của bạn kết nối với nhau.
Điều hướng bằng NavDeepLinkRequest
Để điều hướng tới một đích đến của đường liên kết sâu ngầm ẩn, hãy sử dụng phương thức nạp chồng navigate(NavDeepLinkRequest)
. Đoạn mã sau đây cung cấp cách triển khai phương thức này:
Kotlin
val request = NavDeepLinkRequest.Builder
.fromUri("android-app://androidx.navigation.app/profile".toUri())
.build()
findNavController().navigate(request)
Java
NavDeepLinkRequest request = NavDeepLinkRequest.Builder
.fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
.build()
NavHostFragment.findNavController(this).navigate(request)
Không giống như cách điều hướng bằng mã thao tác hoặc mã đích đến, bạn có thể chuyển đến bất kỳ đường liên kết sâu nào trong biểu đồ, cho dù đích đến đó có hiển thị hay không. Bạn có thể điều hướng đến một đích đến trên biểu đồ hiện tại hoặc trên một biểu đồ hoàn toàn khác.
Thao tác và loại MIME
Ngoài Uri
, NavDeepLinkRequest
cũng hỗ trợ các đường liên kết sâu với thao tác và loại MIME. Để thêm một thao tác vào yêu cầu, hãy sử dụng fromAction()
hoặc setAction()
. Để thêm một loại MIME vào yêu cầu, hãy sử dụng fromMimeType()
hoặc setMimeType()
.
Để NavDeepLinkRequest
khớp với đích đến của đường liên kết sâu ngầm ẩn thì URI, thao tác và loại MIME phải khớp với NavDeepLink
trong đích đến. URI phải khớp với mẫu, các thao tác phải khớp chính xác và loại MIME phải liên quan với nhau. Ví dụ: image/jpg
khớp với image/\*
Ngữ cảnh khác
Tài liệu này trình bày cách sử dụng NavController.navigate()
trong các trường hợp sử dụng phổ biến nhất. Tuy nhiên, hàm này có một loạt các phương thức nạp chồng mà bạn có thể sử dụng trong nhiều ngữ cảnh và kết hợp với bất kỳ khung giao diện người dùng nào. Hãy xem tài liệu tham khảo để biết thêm thông tin chi tiết về các phương thức nạp chồng này.
Tài liệu đọc thêm
Để biết thêm thông tin chi tiết, vui lòng xem các trang dưới đây:
- Tạo một trình điều khiển điều hướng
- Thành phần Điều hướng và ngăn xếp lui
- Điều hướng bằng các lựa chọn
- An toàn về kiểu trong Kotlin DSL và Navigation Compose