Pengguna menavigasi mundur melalui layar menggunakan navigasi mundur. Sebagian besar perangkat Android memiliki tombol kembali (fisik, software, atau berbasis gestur). Biasanya, Anda tidak perlu menambahkan tombol kembali ke aplikasi. Namun, perangkat Android Automotive OS (AAOS) dalam mode kompatibilitas menggunakan tombol kembali sistem. Hal ini menangani navigasi, sehingga Anda tidak perlu menambahkan navigasi sendiri. Untuk mengetahui detailnya, lihat Mode Kompatibilitas AAOS.
Android menyimpan data sebelumnya dari tujuan saat pengguna bernavigasi di dalam aplikasi Anda. Hal ini biasanya memungkinkan Android menavigasi dengan benar ke tujuan sebelumnya saat tombol Kembali ditekan. Namun, ada beberapa kasus ketika aplikasi Anda mungkin perlu mengimplementasikan perilaku Kembali-nya sendiri untuk memberikan pengalaman pengguna sebaik mungkin. Misalnya, saat menggunakan WebView,
sebaiknya Anda mengganti perilaku tombol Kembali default agar pengguna
dapat kembali menjelajahi histori penjelajahan web mereka, bukan layar sebelumnya
di aplikasi Anda.
Mengimplementasikan navigasi kembali kustom di Compose
Di Jetpack Compose, Anda dapat menangani navigasi kembali kustom menggunakan
composable BackHandler.
Saat menggunakan Navigation Compose, Anda biasanya menggunakan
NavController.navigateUp() atau NavController.popBackStack()
untuk membuka layar sebelumnya di data sebelumnya. Namun, BackHandler
berguna untuk kasus saat Anda ingin menerapkan perilaku kustom ketika pengguna
menekan tombol kembali sistem atau menggunakan gestur kembali. Misalnya, jika Anda
menampilkan WebView di aplikasi, Anda mungkin ingin mengizinkan pengguna
kembali menjelajahi histori penjelajahan saat mereka menekan tombol kembali sistem.
Penggunaan dasar
Berikut adalah contoh yang menunjukkan cara mengintersepsi peristiwa kembali untuk mengontrol status kustom (seperti menciutkan panel):
@Composable fun MyScreen() { var isExpanded by remember { mutableStateOf(false) } // Intercept the back button or gesture only when isExpanded is true BackHandler(enabled = isExpanded) { // Collapsing the content disables this handler, so it does not // receive the next back event. isExpanded = false } if (isExpanded) { Text("Expanded content. Go back to collapse it.") } else { Button(onClick = { isExpanded = true }) { Text("Expand") } } }
Intersepsi hierarki composable
Jika Anda memiliki beberapa composable BackHandler yang diaktifkan di berbagai tingkat
pohon composable, hanya yang paling dalam yang mencegat peristiwa kembali.
Mengimplementasikan navigasi kembali kustom dengan View
ComponentActivity, class dasar untuk FragmentActivity dan
AppCompatActivity, memungkinkan Anda mengontrol perilaku tombol Kembali
dengan menggunakan OnBackPressedDispatcher-nya, yang dapat Anda ambil dengan memanggil
getOnBackPressedDispatcher().
OnBackPressedDispatcher mengontrol cara peristiwa tombol Kembali dikirim ke salah satu atau beberapa objek OnBackPressedCallback. Konstruktor untuk
OnBackPressedCallback mengambil logika boolean untuk status aktif awal. Hanya saat
callback diaktifkan, misalnya saat isEnabled() menampilkan true, dispatcher akan memanggil handleOnBackPressed() callback untuk menangani
peristiwa tombol Kembali. Anda dapat mengubah status aktif dengan memanggil setEnabled().
Callback ditambahkan menggunakan metode addCallback. Gunakan metode addCallback() yang menggunakan LifecycleOwner. Dengan cara ini,
OnBackPressedCallback hanya akan ditambahkan saat LifecycleOwner adalah
Lifecycle.State.STARTED. Aktivitas ini juga akan menghapus callback yang terdaftar
saat LifecycleOwner terkait dihancurkan, yang mencegah kebocoran memori
dan membuatnya cocok untuk digunakan dalam fragmen atau pemilik siklus proses lain yang memiliki
masa berlaku lebih pendek daripada aktivitas tersebut.
Berikut adalah contoh implementasi callback:
class MyFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // This callback will only be called when MyFragment is at least Started. val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { // Handle the back button event } // The callback can be enabled or disabled here or in the lambda } ... }
Anda dapat memberikan beberapa callback menggunakan addCallback().
Saat melakukannya, callback akan dipanggil dalam urutan terbalik ketika ditambahkan—callback yang ditambahkan terakhir adalah callback pertama yang diberikan kesempatan untuk menangani peristiwa tombol Kembali. Misalnya, jika Anda menambahkan tiga callback bernama
one, two, dan three secara berurutan, maka callback tersebut akan dipanggil dalam urutan
three, two, dan one.
Callback mengikuti pola Chain of Responsibility. Setiap callback dalam rangkaian hanya dipanggil jika callback sebelumnya tidak diaktifkan. Ini berarti bahwa dalam contoh sebelumnya, callback two hanya akan dipanggil jika callback three tidak diaktifkan. Callback one hanya akan dipanggil jika callback two tidak diaktifkan, dan pola ini berlanjut untuk callback tambahan lainnya.
Perhatikan bahwa saat ditambahkan menggunakan addCallback(),
callback tidak ditambahkan ke chain of responsibility hingga
LifecycleOwner memasuki status
Lifecycle.State.STARTED.
Mengubah status aktif pada callback sangatlah direkomendasikan untuk perubahan sementara karena dapat menjaga pengurutan seperti yang dijelaskan sebelumnya, yang sangat penting jika Anda memiliki callback yang didaftarkan di beberapa pemilik siklus proses bertingkat yang berbeda.
Jika Anda ingin menghapus callback sepenuhnya, panggil
remove().
Hal ini biasanya tidak diperlukan karena callback otomatis dihapus saat LifecycleOwner terkait telah dihancurkan.