web-dev-qa-db-fra.com

Pourquoi Android Écran de composant de navigation ne revient pas au fragment précédent, mais une méthode dans OnSIVECARED de fragment de préavios étant appelée?

J'ai 2 fragments appel CreateRoomFragment et DisplayPhotoFragment, le graphique de navigation est ressemblant à ceci:

<navigation>    
<fragment
    Android:id="@+id/createRoomFragment"
    Android:name="package.room.CreateRoomFragment"
    Android:label="Create a room"
    tools:layout="@layout/fragment_create_room">
    <action
        Android:id="@+id/action_createRoomFragment_to_roomFragment"
        app:destination="@id/roomFragment" />
    <action
        Android:id="@+id/action_createRoomFragment_to_displayPhotoFragment"
        app:destination="@id/displayPhotoFragment" />
</fragment>

<fragment
    Android:id="@+id/displayPhotoFragment"
    Android:name="package.fragment.DisplayPhotoFragment"
    Android:label="fragment_display_photo"
    tools:layout="@layout/fragment_display_photo" >
    <argument Android:name="bitmap"
              app:argType="Android.graphics.Bitmap"/>
</fragment>

Alors, quand je veux passer à partir de CreateRoomFragment à DisplayPhotoFragment, j'utilise le do ci-dessous:

NavDirections action = CreateRoomFragmentDirections.actionCreateRoomFragmentToDisplayPhotoFragment(selectedPhoto);
Navigation.findNavController(view).navigate(action);

Faire cela, je peux naviguer vers DisplayPhotoFragment.

Mais quand j'appuie back bouton de l'appareil et aussi le Back arrow Dans la barre d'outils, cela ne peut pas revenir à CreateRoomFragment.

J'ai essayé ceci, mais toujours incapable de revenir au fragment précédent:

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
                new OnBackPressedCallback(true) {
                    @Override
                    public void handleOnBackPressed() {

                       navController.navigateUp();  //I tried this 
                       navController.popBackStack(R.id.createRoomFragment,false); //and also this
                    }
                });

problème principal maintenant :

En utilisant le code ci-dessus, l'écran ne retourna pas au fragment précédent (CreateRoomFragment). Il reste coincé dans DisplayPhotoFragment, mais en même temps, une méthode API dans CreateRoomFragmentonViewCreated section est appelée.

Qu'est-ce qui cause cela? Et comment puis-je résoudre ce problème?

7
ken

Android maintient une pile arrière contenant les destinations que vous avez visitées. La première destination de votre application est placée sur la pile lorsque l'utilisateur ouvre l'application. Chaque appel à la méthode navigate() met une autre destination sur la pile. Taping up ou arrière appelle les options NavController.navigateUp() et NavController.popBackStack() méthodes, respectivement, pour supprimer (ou POP) la destination supérieure de la pile.

NavController.popBackStack() Retourne un booléen indiquant s'il est renvoyé avec succès à une autre destination. Le cas le plus courant lorsque cela renvoie false est lorsque vous allez manuellement la destination de départ de votre graphique.

Lorsque la méthode renvoie false, NavController.getCurrentDestination() renvoie null. Vous êtes responsable de la navigation sur une nouvelle destination ou de la manipulation de la pop en appelant finish() sur votre activité.

Lorsque vous naviguez à l'aide d'une action, vous pouvez éventuellement faire des destinations supplémentaires de la pile arrière à l'aide de popUpTo et popUpToInclusive paramètre de l'action.

class MyFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (true == conditionForCustomAction) {
                    CustomActionHere()
                } else  NavHostFragment.findNavController(this@MyFragment).navigateUp();    
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(
        this, onBackPressedCallback
    )
    ...
}
5
Sanjay Bhalani