5
votes

Créer une seule instance de fragment lors de la navigation vers les destinations (Android)

J'utilise le composant de navigation. lors de la navigation, je ne veux pas créer de nouvelle instance de fragment si elle existe déjà dans le backstack et pop celle déjà existante devant.

    findNavController().navigate(RequestTransferFragmentDirections.actionRequestTransferFragmentToBlankFragment())

regarder en avant pour trouver une solution.

Merci.


4 commentaires

Veuillez ajouter plus de détails sur ce que vous demandez. Ajoutez du code pour montrer ce que vous avez programmé ou ajoutez une image qui pourrait être utile. De cette façon, vous êtes beaucoup plus susceptible d'obtenir une réponse à votre question.


J'ai ajouté le code. si cela ne suffit pas, dites-moi quel code dois-je ajouter.


Bonjour, avez-vous trouvé s'il existe un moyen d'ajouter une instance du fragment?


Bonjour, oui je geuss, je remplace fun onNavigationItemSelected (item: MenuItem): Boolean dans l'activité principale et navOptions utilisé. val navBuilder = NavOptions.Builder () val navOptions = navBuilder.setPopUpTo (item.itemId, true) .build ()


3 Réponses :


0
votes

Répondre ici parce que j'avais la même question. Ce qui suit est une solution qui a fonctionné pour moi. J'ai fini par utiliser le contrôleur de navigation et je suis arrivé à une destination de backstack si elle existe, si elle n'existe pas, je navigue vers elle normalement.

Cela ressemble à ceci:

/**
     * Attempts to pop the controller's back stack back to a specific destination.
     *
     * @param destinationId The topmost destination to retain
     * @param inclusive Whether the given destination should also be popped.
     *
     * @return true if the stack was popped at least once and the user has been navigated to
     * another destination, false otherwise
     */
    public boolean popBackStack(@IdRes int destinationId, boolean inclusive) {
        boolean popped = popBackStackInternal(destinationId, inclusive);
        // Only return true if the pop succeeded and we've dispatched
        // the change to a new destination
        return popped && dispatchOnDestinationChanged();
    }

nav.popBackStack(R.id.action_profile, false) retournera false si la destination passée n'est pas dans la backstack, sinon elle y apparaît et retourne true si c'est le cas. Le booléen est également utilisé pour faire apparaître le fragment de destination.

À partir de la documentation:

if ( ! nav.popBackStack(R.id.action_profile, false)) {
    nav.navigate(R.id.action_profile)
}


0 commentaires

1
votes

Vous pouvez faire quelque chose comme:

bottomNavigation.setupWithNavController(navController)
bottomNavigation.setOnNavigationItemSelectedListener {
    if (it.itemId == R.id.navigation_home) {
        navController.popBackStack(R.id.navigation_home, false)
        true
    }
    else
        NavigationUI.onNavDestinationSelected(it , navController)
}

entrez la description de l'image ici

Avec le code ci-dessus chaque fois que l'utilisateur clique sur l'élément Accueil (R.id.navigation_home) dans la vue de navigation inférieure, l'application reviendra à l'instance existante de la destination d' accueil à l'aide de popBackStack () .

Si le sélectionne une autre destination dans la navigation du bas, l'application accède à cette destination à l'aide de NavigationUI.onNavDestinationSelected ()


0 commentaires

1
votes

J'ai rencontré le même problème, mais les solutions précédentes n'ont malheureusement pas fonctionné pour moi, bien qu'elles soient censées résoudre le problème. Merci btw! :)

Cela a fonctionné pour moi, adapté à votre code serait:

findNavController().navigate(
    RequestTransferFragmentDirections.actionRequestTransferFragmentToBlankFragment()),
    NavOptions.Builder().setLaunchSingleTop(true).build()
)

J'ai vu dans la documentation de navigation () que nous pouvons passer des options , donc en passant NavOptions.Builder().setLaunchSingleTop(true).build() créera une seule instance d'un tel fragment.


0 commentaires