J'essaie de sortir de la composante de navigation Androidx et j'ai configuré mon activité avec une barre d'outils un conteneur. Je le fais dans l'un des écrans intermittents de mon application qui a beaucoup de navigation/étapes internes et je pensais que je pourrais naviguer dans la composante archigno d'essayer avec cela.
Comme il s'agit d'un écran intermittent, je souhaite afficher un bouton arrière dans la barre d'outils à partir du premier écran lui-même.
J'ai déjà configuré la barre d'outils avec le code ci-dessous dans la méthode Oncreate () de mon activité hôte,
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
NavigationUI.setupActionBarWithNavController(this, navHostFragment.getNavController());
Je peux voir la flèche du bouton arrière/arrière sur le deuxième écran de mon graphique mais pas sur le premier écran.
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/navigation"
app:startDestination="@id/listing">
<fragment
Android:id="@+id/listing"
Android:name=".ui.ItemsListingFragment"
Android:label="Items"
tools:layout="@layout/items_listing" >
<action
Android:id="@+id/listToQuantity"
app:destination="@id/quantity"
/>
<action
Android:id="@+id/listToReason"
app:destination="@id/reason"
/>
</fragment>
<fragment
Android:id="@+id/quantity"
Android:name=".ui.ItemQuanitySelectionFragment"
Android:label="Items"
tools:layout="@layout/fragment_item_quanity_selection" >
<action
Android:id="@+id/quantityToReason"
app:destination="@id/reason"
/>
</fragment>
<fragment
Android:id="@+id/reason"
Android:name=".ui.ItemReasonFragment"
Android:label="Items"
tools:layout="@layout/fragment_item_reason">
</fragment>
</navigation>
Que dois-je apporter de plus de modifications pour ajouter le bouton arrière de la barre d'outils à partir de la première étape.
Le bouton arrière est affiché sous onSupportNavigateUp()
Méthode Retour true
. Vous devez remplacer onSupportNavigateUp()
méthode.
@Override
protected void onCreate(Bundle savedInstanceState) {
//
setSupportActionBar(mToolbar)
mNavController = getNavController();
mAppBarConfiguration = new AppBarConfiguration.Builder().build();
NavigationUI.setupActionBarWithNavController(this, mNavController, mAppBarConfiguration);
}
@Override
public boolean onSupportNavigateUp() {
//
if (!(mNavController.navigateUp() || super.onSupportNavigateUp())) {
onBackPressed();
}
return true;
}
Lorsque vous appelez setUpActionBarWithNavCntroller
, vous devez remplacer la fonction onSupportNavigateUp
, comme ceci:
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.navHostFragment).navigateUp()
|| super.onSupportNavigateUp()
}
1- J'ai créé une interface pour afficher/masquer la touche UP de l'activité NAV Host.
interface ShowUpButtonListener {
fun showUpButton()
fun hideUpButton()
}
2- Voici comment l'activité implémente les méthodes d'interface pour afficher/masquer le bouton UP:
override fun showUpButton() {
val navController = this.findNavController(R.id.nav_Host)
val listener = AppBarConfiguration.OnNavigateUpListener { navController.navigateUp() }
val abc = AppBarConfiguration.Builder().setFallbackOnNavigateUpListener(listener).build()
NavigationUI.setupActionBarWithNavController(this, navController, abc)
}
override fun hideUpButton() {
val navController = this.findNavController(R.id.nav_Host)
NavigationUI.setupActionBarWithNavController(this, navController)
}
3- Ici la méthode de l'activité lorsque vous appuyez sur la touche UP. Si lors de la destination du démarrage, implémentez le coverbacked ():
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.nav_Host)
if(!navController.navigateUp()){ // When in start destination
onBackPressed()
}
return navController.navigateUp()
}
4- Dans un fragment Créer une propriété d'auditeur de boutons Show Up:
private lateinit var showUpButtonListener: ShowUpButtonListener
5- Attribuer une propriété au contexte Activité:
override fun onAttach(context: Context) {
super.onAttach(context)
if(context is ShowUpButtonListener){
showUpButtonListener = context
}
}
6- Dans le fragment Call Masquer ou Afficher le bouton de la propriété de l'interface:
fun someFunction() {
showUpButtonListener.showUpButton()
}
7- Dans un fragment peut écouter chaque fois que vous appuyez sur la touche arrière (pas de haut) enfoncée:
private fun setupBackPress() {
requireActivity()
.onBackPressedDispatcher
.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
}
})
}