Ahora se encuentra en la cuarta parte de un gran artículo sobre el componente de navegación en un proyecto de varios módulos. Si ya lo sabe:
Entonces, bienvenido a la parte final de la historia sobre mi experiencia con esta maravillosa biblioteca, sobre la solución para navegación multiestack similar a iOS.
Puedes ver como funciona todo aqui
Si no lo sabe, salga y entre normalmente lea primero los tres artículos anteriores.
Además de la biblioteca de componentes de navegación, Google ha lanzado varios complementos de interfaz llamados NavigationUI que lo ayudan a conectar la navegación a BottomBar, Menu y otros componentes estándar. Pero a menudo hay requisitos de que cada pestaña tenga su propia pila y los estados actuales se guarden al cambiar entre ellos. Desafortunadamente, el componente de navegación y la interfaz de usuario de navegación no hacen eso.
Google proporcionó soporte para este enfoque en su repositorio de muestras de componentes de arquitectura en GitHub ( https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample ). Su esencia es simple:
Agregue FragmentContainer.
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- . — , .