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 CreateRoomFragment
onViewCreated
section est appelée.
Qu'est-ce qui cause cela? Et comment puis-je résoudre ce problème?
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
)
...
}