web-dev-qa-db-fra.com

Afficher le bouton arrière sur la barre d'outils sur le premier écran de navigation

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.

13
Abhiroop

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;
    }
0
尹劍平

Lorsque vous appelez setUpActionBarWithNavCntroller, vous devez remplacer la fonction onSupportNavigateUp, comme ceci:

override fun onSupportNavigateUp(): Boolean {
    return findNavController(R.id.navHostFragment).navigateUp() 
            || super.onSupportNavigateUp()
}
0
Devansh Maurya

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() { 
            }
        })
}
0
fullmoon