Composant de navigation, comment afficher un bouton UP/back normal au lieu d'une icône de hamburger dans le tiroir de navigation

hahmraro

J'ai trois fragments de destination de niveau supérieur dans mon activité :

appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.trackerFragment,
            R.id.nutrientFragment,
            R.id.settingsFragment
        ),
        drawerLayout
    )

Ce qui signifie que tous ces fragments afficheront le bouton hamburger au lieu de la flèche arrière normale. Le problème est que j'ai un bouton "Aller à Nutrient" dans mon application qui navigue vers NutrientFragment, qui est une destination de premier niveau. J'aimerais que ce fragment affiche toujours l'icône du hamburger lors de la navigation avec le tiroir, mais un bouton de sauvegarde/retour normal lors de la navigation via le bouton "Aller aux éléments nutritifs".

Mon idée initiale était de passer une valeur booléenne en argument lors de la navigation vers NutrientFragment, et à l'intérieur onCreateView(), en fonction de la valeur du booléen, supprimer l'icône hamburger ou ajouter le bouton retour. Mais cela semble un peu moche et inefficace, surtout si à l'avenir j'ajoute d'autres destinations qui pourraient avoir le même problème. Je ne sais pas non plus comment "supprimer l'icône du hamburger et la remplacer par le bouton de retour normal". Une idée sur la façon de mettre cela en œuvre? Toutes les réponses que j'ai trouvées sont soit dans un ancien code Java obsolète, soit pas tout à fait ce que je recherche.

Merci.

hahmraro

J'ai réussi à trouver une solution. J'ai ajouté cette variable à mon MainActivity :

// If true, disable drawer and enable back/up button
private var isUpButton = false

Et ces méthodes :

// Disable drawer and enable the up button
fun useUpButton() {
    supportActionBar?.setHomeAsUpIndicator(
        androidx.appcompat.R.drawable.abc_ic_ab_back_material
    )
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
    isUpButton = true
}

// Enable the drawer and disable up button
private fun useHamburgerButton() {
    drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
    isUpButton = false
}

useUpButton() remplace l'icône hamburger par l'icône par défaut vers le haut, verrouille le curseur du tiroir et définit isUpButton sur true. J'ai également remplacé onOptionsItemsSelected :

// If isUpButton is true, and the home button is clicked, navigate up and
// enable drawer again, if false, just normal drawer behaviour
override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return if (isUpButton && item.itemId == android.R.id.home) {
        navController.navigateUp()
        useHamburgerButton()
        true
    } else super.onOptionsItemSelected(item)
}

Donc, si le bouton d'accueil (soit l'icône hamburger soit l'icône haut) est cliqué et que isUpButton est défini sur true, l'activité naviguera vers le haut, tout comme le comportement normal, et réinitialisera isUpButton sur false, afin que d'autres fragments puissent profiter du tiroir de nouveau.

Maintenant, tout ce que j'ai à faire est d'utiliser ces méthodes pour résoudre mon problème : je veux que le NutrientFragment affiche le "bouton haut" UNIQUEMENT lorsque j'y navigue SANS utiliser le tiroir. Pour ce faire, je dois créer un argument vers la destination NutrientFragment sur mon nav_graph.xml :

<fragment
    android:id="@+id/nutrientFragment"
    android:name="com.example.elegantcalorietracker.ui.fragments.NutrientFragment"
    android:label="@string/nutrients"
    tools:layout="@layout/fragment_nutrient">
    <action
        android:id="@+id/action_nutrientFragment_to_trackerFragment"
        app:destination="@id/trackerFragment" />
    <argument
        android:name="upButtonNeeded"
        android:defaultValue="false"
        app:argType="boolean" />

Et ajoutez ceci à la méthode onCreateView() sur NutrientFragment :

upButtonNeeded = arguments?.getBoolean("upButtonNeeded") ?: false
if (upButtonNeeded) {
    (activity as MainActivity).useUpButton()
}

Maintenant, si j'ai un bouton dans un autre fragment qui navigue vers NutrientFragment, tout ce que j'ai à faire est de passer true comme argument à la méthode de navigation :

val argument = bundleOf("upButtonNeeded" to true)
this@TrackerFragment
     .findNavController()
     .navigate(
         R.id.action_trackerFragment_to_nutrientFragment,
         argument
     )

Résultat:

Lorsque vous naviguez vers NutrientFragment à l'aide du tiroir, l'icône du hamburger s'affiche normalement, mais lorsque vous y accédez d'une autre manière, comme un bouton, le bouton haut s'affiche à la place :

Gif de solution

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  2. 2

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  5. 5

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  6. 6

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  7. 7

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  8. 8

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  9. 9

    Trouver l'intersection et l'union de deux rectangles

  10. 10

    Comment convertir une chaîne en tuple en utilisant `reads`?

  11. 11

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  12. 12

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  13. 13

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  14. 14

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  15. 15

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  16. 16

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    comment le contrôle de tableau javascript devrait-il être

  19. 19

    Importation bizarre de Google Sheets importxml - Impossible d'obtenir le chemin correct vers les éléments

  20. 20

    Injecter des éléments dans une liste existante au printemps

  21. 21

    Placez le modeBar en haut au centre à l'aide de plotly.js

chaudétiquette

Archive