J'ai besoin de quelques suggestions;
J'expérimente avec la bibliothèque de navigation. J'ai un fragment qui a une webView. Je veux vérifier si elle canGoBack
et le faire si elle le peut, sinon ne pas interférer.
1. Approche d'interface: Puisque la navigation gère les transactions, je ne crée plus manuellement une instance de mon fragment, que je peux affecter en tant qu'auditeur en activité.
1. Écoute clé: Je pense vraiment que ça a l'air moche et je ne pense pas que ce soit une solution générique, donc je saute celle-ci.
J'ai besoin de quelques opinions sur la façon de le faire avec la bibliothèque de navigation. Lorsque vous essayez d'obtenir currentDestination
à partir de navController
, c'est NavigationDestination
objet qui fournit des informations sur le fragment actuel, comme l'étiquette donnée en xml.
Lorsque j'inspecte fragmentManager
, je constate que backStack
est vide et que la transaction de fragment a eu lieu sans balise.
À mon humble avis, cela ne correspondrait pas au concept de la bibliothèque de faire findFragment
type d'opérations pour interagir quelque peu avec le fragment actuel, mais je n'arrive pas à trouver un moyen de le faire pour le moment. Aucune suggestion ?
J'ai trouvé un moyen de le faire comme auparavant avec l'interface ou la classe de fragment de base.
en activité:
override fun onBackPressed() {
val f = currentFragment
if (f !is BaseFragment || f.onBackPressed()) {
if (!findNavController(R.id.nav_Host_fragment).navigateUp()) {
super.onBackPressed()
}
}
}
val currentFragment: Fragment?
get() = nav_Host_fragment.childFragmentManager.findFragmentById(R.id.nav_Host_fragment)
dans BaseFragment:
open fun onBackPressed() = true /*or false if you want to prevent navigation*/
OnBackPressedCallback peut être utilisé pour cela:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
activity?.addOnBackPressedCallback {
Log.d(TAG, "handleOnBackPressed")
//Your custom back behaviour
return@addOnBackPressedCallback false
}
}
Renvoyez false
si vous souhaitez que le comportement de retour par défaut s'exécute. Retournez true
pour l'ignorer.
Nous pouvons gérer directement OnBackPressed à partir de n'importe quel fragment
requireActivity().onBackPressedDispatcher
.addCallback(viewLifecycleOwner, object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
//Handle back event from any fragment
}
})
Mettez le code ci-dessus dans onViewCreated