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.
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 :
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots