Traitement de bouton de Navigation Android Composant
Je voudrais savoir comment gérer correctement le système de bouton de retour action en utilisant la manette de Navigation. Dans mon application j'ai deux fragments (par ex. fragment1 et fragment2) et j'ai une action en fragment1 à destination de fragment2. Tout fonctionne bien sauf une chose: quand l'utilisateur appuie sur le système de bouton retour dans fragment2 je veux afficher une boîte de dialogue (à l'aide de DialogFragment par exemple) pour confirmer la sortie. Quelle est la meilleure façon de mettre en œuvre ce comportement? Si j'utilise app:defaultNavHost="true"
dans mon hôte fragment puis il revient automatiquement en ignorant mes règles. Et, en outre, quel est ce composant?
Devrais-je utiliser "pop" peut-être?
- Avec "Pop", vous pouvez définir l'endroit où aller(destination) en cliquant sur le dos/bouton haut.
- Donc, s'il est défini sur aucun, comment doit-il réagir à bouton de retour?
- Quand il réglé sur "none", le comportement par défaut, l'utilisateur sera navigué à destination précédente(fragment 1)
- ok, est-il possible de poignée bouton de retour en deuxième fragment?
- stackoverflow.com/a/51044879/1268507
Vous devez vous connecter pour publier un commentaire.
Nouvelle version androidx.l'activité du ver. 1.0.0-alpha07 apporte quelques changements
Plus d'explications android guide officiel: Personnaliser le dos de navigation
Exemple:
UPD: 3 avril 2019
Désormais simplifié. Plus d'infos ici
Exemple:
Obsolète (depuis la Version 1.0.0-alpha06
3 avril 2019) :
Depuis cette, il peut être implémenté à l'aide de JetPack mise en œuvre
OnBackPressedCallback
dans votre fragmentet l'ajouter à l'activité:
getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);
Votre fragment devrait ressembler à ceci:
UPD:
Votre activité doit s'étend
AppCompatActivity
ouFragmentActivity
et dans Gradle fichier:Donc, j'ai créé une interface
Et mis en œuvre par tous les fragments qui doivent traiter de bouton de retour. Dans l'activité principale, je surdéfini
onBackPressed()
méthode:Donc, Si le fragment du haut de ma Navigation accueil met en œuvre
OnBackPressedListener
interface, je l'appelle de sesonBackPressed()
méthode, d'ailleurs j'ai simplement pop pile de retour et fermer l'application si l'arrière de la pile est vide.Voici une solution qui devrait faire ce que vous voulez, mais je pense que c'est une mauvaise solution, car il va à l'encontre de Navigation Android composant idée(en laissant le android manipuler le système de navigation).
Remplacer "onBackPressed" à l'intérieur de votre activité
La recommandé approche consiste à ajouter une
OnBackPressedCallback
de l'activitéOnBackPressedDispatcher
.Kotlin
Java
Un peu en retard à la fête, mais avec la dernière version de Navigation de la Composante 1.0.0-alpha09, maintenant, nous avons une AppBarConfiguration.OnNavigateUpListener.
Consulter ces liens pour plus d'informations:
https://developer.android.com/reference/androidx/navigation/ui/AppBarConfiguration.OnNavigateUpListener
https://developer.android.com/jetpack/docs/release-notes
De l'essayer. Je pense que cela va vous aider.
remplacer plaisir onBackPressed() {
quand (mNavController.getCurrentDestination()!!.getId()) {
}
Voici ma solution
Utilisation
androidx.appcompat.app.AppCompatActivity
de l'activité qui contient leNavHostFragment
fragment.Définir les éléments suivants de l'interface et de l'implanter dans l'ensemble de la navigation de destination des fragments
Dans votre activité remplacer
onSupportNavigateUp
etonBackPressed
:Cette solution a l'avantage, que la destination de navigation fragments n'ont pas besoin de s'inquiéter à propos de l'annulation de l'inscription de leurs auditeurs, dès qu'ils sont détachés.
J'ai essayé de Jurij Pitulja solution mais je n'étais tout simplement pas en mesure de trouver getOnBackPressedDispatcher ou addOnBackPressedCallback
aussi à l'aide de Kiryl Tkach la solution n'était pas en mesure de trouver le courant fragment, donc voici la mienne:
de cette façon, vous pouvez décider du fragment si l'activité doit prendre le contrôle de retour pressé ou pas.
Alternativement, vous avez BaseActivity pour toutes vos activités, vous pouvez mettre en œuvre comme ce