web-dev-qa-db-fra.com

Android gestion onBackPressed avec le nouveau composant de navigation

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 ?

13
Mel

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*/
9
AnoDest

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.

0
Sven

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

0
Kalpesh Kulye