Sie befinden sich jetzt im vierten Teil eines großartigen Artikels über die Navigationskomponente in einem Projekt mit mehreren Modulen. Wenn Sie bereits wissen:
Willkommen zum letzten Teil der Geschichte über meine Erfahrungen mit dieser wunderbaren Bibliothek - über die Lösung für die iOS-ähnliche Multistack-Navigation.
Hier können Sie sehen, wie alles funktioniert
Wenn Sie es nicht wissen, gehen Sie raus und kommen Sie herein. Lesen Sie zuerst die drei obigen Artikel.
Zusätzlich zur Navigationskomponentenbibliothek hat Google mehrere Frontend-Add-Ons namens NavigationUI veröffentlicht, mit denen Sie die Navigation mit BottomBar, Menu und anderen Standardkomponenten verbinden können. Oft gibt es jedoch Anforderungen, dass jede Registerkarte einen eigenen Stapel hat und die aktuellen Status beim Wechseln zwischen ihnen gespeichert werden. Leider tun dies die Navigationskomponente und die Navigations-Benutzeroberfläche nicht sofort.
Die Unterstützung für diesen Ansatz wurde von Google selbst in seinem Repository für Architekturkomponenten-Beispiele auf GitHub ( https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample ) bereitgestellt . Sein Wesen ist einfach:
Fügen Sie FragmentContainer hinzu.
NavHostFragment .
NavHostFragment FragmentManager-a.
, :
. NavigationBottomBar Deep Link-. , deep link- . , — . NavigationExtensions 250 loc, lazy- NavHost-, :
/ NavHost-:
fun obtainNavHostFragment(
fragmentManager: FragmentManager,
fragmentTag: String,
navGraphId: Int,
containerId: Int
): NavHostFragment {
// If the Nav Host fragment exists, return it
val existingFragment =
fragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment?
existingFragment?.let { return it }
// Otherwise, create it and return it.
val navHostFragment = NavHostFragment.create(navGraphId)
fragmentManager.beginTransaction()
.add(containerId, navHostFragment, fragmentTag)
.commitNow()
return navHostFragment
}
NavHost-:
protected fun selectTab(tab: Tab) {
val newFragment = obtainNavHostFragment(
childFragmentManager,
getFragmentTag(tabs.indexOf(tab)),
tab.graphId,
containerId
)
val fTrans = childFragmentManager.beginTransaction()
with(fTrans) {
if (selectedFragment != null) detach(selectedFragment!!)
attach(newFragment)
commitNow()
}
selectedFragment = newFragment
currentNavController = selectedFragment!!.navController
tabSelected(tab)
}
“Back”:
activity?.onBackPressedDispatcher?.addCallback(
viewLifecycleOwner,
object: OnBackPressedCallback(true){
override fun handleOnBackPressed() {
val isNavigatedUp = currentNavController.navigateUp()
if(isNavigatedUp){
return
}else{
activity?.finish()
}
}
}
)
iOS-like , lazy- . — , .