Berinteraksi secara terprogram dengan komponen Navigasi

Komponen Navigasi menyediakan cara untuk membuat dan berinteraksi secara terprogram dengan elemen navigasi tertentu.

Membuat NavHostFragment

Anda dapat menggunakan NavHostFragment.create() untuk membuat NavHostFragment secara terprogram dengan sumber daya grafik tertentu, seperti yang ditunjukkan dalam contoh di bawah ini:

Kotlin

val finalHost = NavHostFragment.create(R.navigation.example_graph)
supportFragmentManager.beginTransaction()
    .replace(R.id.nav_host, finalHost)
    .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
    .commit()

Java

NavHostFragment finalHost = NavHostFragment.create(R.navigation.example_graph);
getSupportFragmentManager().beginTransaction()
    .replace(R.id.nav_host, finalHost)
    .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
    .commit();

Perhatikan bahwa setPrimaryNavigationFragment(finalHost) memungkinkan sistem intersepsi NavHost Anda menekan tombol Kembali. Anda juga dapat menerapkan perilaku ini dalam XML NavHost Anda dengan menambahkan app:defaultNavHost="true". Jika Anda menerapkan perilaku tombol Kembali kustom dan tidak ingin NavHost Anda menekan tombol Kembali, Anda dapat meneruskan null ke setPrimaryNavigationFragment().

Bagikan data terkait UI antara tujuan dengan ViewModel

Dimulai dengan versi 2.1.0-alpha02, Anda dapat membuat ViewModel yang dicakup dalam grafik navigasi, yang memungkinkan Anda untuk berbagi data terkait UI antara tujuan grafik. Setiap objek ViewModel yang dibuat dengan cara ini akan aktif sampai NavHost dan ViewModelStore yang terkait dibersihkan atau sampai grafik navigasi muncul dari tumpukan belakang.

Contoh berikut menunjukkan cara mengambil ViewModel yang dicakup dalam grafik navigasi:

Kotlin

Di Kotlin, Anda dapat menggunakan delegasi properti navGraphViewModels() untuk mengambil ViewModel dari dalam tujuan fragmen:

val factory: ViewModelProviderFactory = ...
val viewModel: MyViewModel
    by navGraphViewModels(R.id.my_graph) { factory }

Perhatikan bahwa dalam contoh ini, by navGraphViewModels() secara otomatis memanggil findNavController() untuk mengambil NavController yang terkait.

Java

ViewModelProviderFactory factory = ...
ViewModelStoreOwner owner = navController.getViewModelStoreOwner(R.id.my_graph);
MyViewModel viewModel = new ViewModelProvider(owner, factory);

Untuk informasi lebih lanjut tentang ViewModel, lihat Ringkasan ViewModel.