Thành phần điều hướng hoạt động trên hệ điều hành Android để duy trì ngăn xếp lui khi người dùng di chuyển trong ứng dụng của bạn. Trong một vài trường hợp, việc duy trì nhiều ngăn xếp lui cùng lúc có thể sẽ tạo điều kiện cho người dùng di chuyển qua lại giữa chúng. Ví dụ: nếu ứng dụng của bạn bao gồm thanh điều hướng dưới cùng hoặc ngăn điều hướng, thì tính năng hỗ trợ nhiều ngăn xếp lui cho phép người dùng tự do chuyển đổi giữa các luồng trong ứng dụng của bạn mà không bị mất chỗ.
Thành phần điều hướng cung cấp các API hỗ trợ nhiều ngăn xếp lui bằng cách lưu và khôi phục trạng thái của đích đến trong biểu đồ điều hướng của bạn. Lớp NavigationUI
bao gồm các phương thức tự động xử lý việc này, nhưng bạn cũng có thể sử dụng các API cơ bản theo cách thủ công để triển khai theo cách riêng.
Tự động triển khai dịch vụ hỗ trợ bằng NavigationUI
Lớp NavigationUI
bao gồm các API tự động lưu và khôi phục trạng thái của các mục trong trình đơn khi người dùng di chuyển giữa các mục đó. Theo mặc định, các API này triển khai chức năng hỗ trợ nhiều ngăn xếp lui trong các trường hợp sau:
- Khi bạn sử dụng quá nhiều
setupWithNavController()
để liên kết một bản sao củaNavigationView
hoặcBottomNavigationView
với bản saoNavController
, như mô tả trong bài viết Thêm ngăn điều hướng hoặc Thanh điều hướng dưới cùng. - Khi bạn sử dụng
onNavDestinationSelected()
để tạo trình đơn điều hướng tuỳ chỉnh cho giao diện người dùng gắn với các đích đến do thực thểNavController
lưu trữ.
Các API này không yêu cầu thay đổi thêm mã để triển khai hỗ trợ nhiều ngăn xếp lui, đây cũng là phương cách được đề xuất để hỗ trợ nhiều ngăn xếp lui trong ứng dụng của bạn.
Triển khai dịch vụ hỗ trợ theo cách thủ công với các API cơ bản
Nếu các phần tử do NavigationUI
cung cấp không đáp ứng yêu cầu của bạn, thì bạn có thể sử dụng các API cơ bản để lưu và khôi phục ngăn xếp lui thông qua một trong các nền tảng API khác do Thành phần điều hướng cung cấp.
Tệp XML điều hướng
Trong XML điều hướng, các phần tử <action>
trong biểu đồ điều hướng có thể sử dụng thuộc tính app:popUpToSaveState
để lưu trạng thái của bất kỳ đích đến nào có hành động bật lên bằng app:popUpTo
. Chúng cũng có thể sử dụng thuộc tính app:restoreState
để khôi phục mọi trạng thái đã lưu trước đó cho đích đến đã xác định trong thuộc tính app:destination
.
Bạn có thể dùng các thuộc tính này để hỗ trợ nhiều ngăn xếp lui. Khi một thao tác điều hướng cần di chuyển người dùng từ ngăn xếp lui này sang một ngăn xếp lui khác, hãy đặt cả app:popUpToSaveState
và app:restoreState
thành true
trong phần tử <action>
tương ứng. Bằng cách đó, hành động này sẽ lưu trạng thái của ngăn xếp lui hiện tại đồng thời khôi phục trạng thái đã lưu trước đó của đích đến trong ngăn xếp lui nếu có.
Ví dụ sau đây cho thấy một hành động sử dụng cả hai thuộc tính này:
<action
android:id=”@+id/swap_stack”
app:destination=”@id/second_stack”
app:restoreState=”true”
app:popUpTo=”@id/first_stack_start_destination”
app:popUpToSaveState=”true” />
NavOptions
Lớp NavOptions
cho phép bạn chuyển các tuỳ chọn điều hướng đặc biệt để lưu và khôi phục ngăn xếp lui khi đang di chuyển bằng NavController
. Điều này luôn đúng cho dù bạn dùng Kotlin DSL hay NavOptions.Builder
để tạo bản sao của NavOptions
:
Kotlin
// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.findStartDestination().id) { saveState = true } }
Java
NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);
Để tìm hiểu thêm về cách chuyển các tuỳ chọn điều hướng, vui lòng xem phần Áp dụng NavOptions theo phương thức lập trình.
Tài nguyên khác
Để tìm hiểu thêm về chức năng hỗ trợ nhiều ngăn xếp lui bằng Thành phần điều hướng, vui lòng xem các tài nguyên bổ sung sau đây:
Bài đăng trên blog
- Kỹ năng MAD (Phát triển Android hiện đại): Di chuyển nhiều ngăn xếp lui trên Medium
- Điều hướng: Tìm hiểu chuyên sâu về nhiều ngăn xếp lui trên Medium
Mẫu
- Ứng dụng Now in Android trên GitHub
- Jetnews trên GitHub
- Jetsnack trên GitHub