Lors de l'utilisation du tiroir de navigation, les développeurs Android recommandent que dans l'ActionBar "seuls les écrans qui sont représentés dans le tiroir de navigation doivent réellement avoir l'image du tiroir de navigation" et que "tous les autres écrans ont le carat traditionnel."
Voir ici pour plus de détails: http://youtu.be/F5COhlbpIbY
J'utilise une activité pour contrôler plusieurs niveaux de fragments et je peux faire en sorte que l'image du tiroir de navigation s'affiche et fonctionne à tous les niveaux.
Lors de la création de fragments de niveau inférieur, je peux appeler ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
pour masquer l'image du tiroir de navigation et afficher le curseur Haut
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
Le problème que j'ai, c'est lorsque je reviens aux fragments de niveau supérieur que Up carat affiche toujours au lieu de l'image originale du tiroir de navigation. Des suggestions sur la façon de "rafraîchir" l'ActionBar sur les fragments de niveau supérieur pour réafficher l'image du tiroir de navigation?
Solution
La suggestion de Tom a fonctionné pour moi. Voici ce que j'ai fait:
Activité principale
Cette activité contrôle tous les fragments de l'application.
Lors de la préparation de nouveaux fragments pour en remplacer d'autres, j'ai défini le DrawerToggle setDrawerIndicatorEnabled(false)
comme ceci:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Ensuite, dans un remplacement de onBackPressed
, j'ai inversé ce qui précède en définissant le DrawerToggle setDrawerIndicatorEnabled(true)
comme ceci:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
Dans le niveau inférieur
Dans les fragments que j'ai modifiés onCreate
et onOptionsItemSelected
comme ceci:
Dans onCreate
ajouté setHasOptionsMenu(true)
pour permettre la configuration du menu d'options. Également défini setDisplayHomeAsUpEnabled(true)
pour activer le < dans la barre d'actions:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Ensuite, onOptionsItemSelected
chaque fois que le < est enfoncé, il appelle le onBackPressed()
de l'activité pour remonter d'un niveau dans la hiérarchie et afficher l'image du tiroir de navigation:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. S'il s'agit d'un niveau de hiérarchie de plus, je m'attendrais à ce que vous.add
le mettiez en réserve.theDrawerToggle.setDrawerIndicatorEnabled(false);
intérieur du fragment? Je pense qu'il est déclaré dans le fichier de classe d'activité principale. Je ne trouve pas un moyen de faire référence à cela. Des indices?setDisplayOptions()
méthode dansToolbarWidgetWrapper
(du package interne android.support.v7.internal.widget) ne recréerait pas l'icône lors de la saisie du même fragment une deuxième fois. Il suffit de laisser cela ici pour que d'autres tombent également sur ce problème.Réponses:
Vous avez écrit que, pour implémenter des fragments de niveau inférieur, vous remplacez le fragment existant, par opposition à l'implémentation du fragment de niveau inférieur dans une nouvelle activité.
Je pense que vous devrez alors implémenter la fonctionnalité de retour manuellement: lorsque l'utilisateur appuie sur vous avez du code qui fait apparaître la pile (par exemple en
Activity::onBackPressed
remplacement). Ainsi, partout où vous faites cela, vous pouvez inverser lesetDrawerIndicatorEnabled
.la source
C'est aussi simple que 1-2-3.
Si vous souhaitez atteindre:
1) Indicateur de tiroir - lorsqu'il n'y a pas de fragments dans la pile arrière ou que le tiroir est ouvert
2) Flèche - lorsque certains fragments sont dans la pile arrière
3) Les deux indicateurs agissent selon leur forme
PS Voir Création d'un tiroir de navigation sur les développeurs Android sur d'autres conseils sur le comportement de l'indicateur à 3 lignes.
la source
setActionBarArrowDependingOnFragmentsBackStack()
... quel long nom: PJ'ai utilisé la chose suivante:
la source
drawerToggle.setToolbarNavigationClickListener(
cet auditeur est appelé en cliquant sur la flècheSi votre bouton de barre d'action haut ne fonctionne pas, n'oubliez pas d'ajouter l'auditeur:
J'ai du mal à implémenter une navigation dans le tiroir avec un bouton d'accueil, tout a fonctionné sauf le bouton d'action.
la source
Essayez de gérer la sélection de l'élément Accueil dans MainActivity en fonction de l'état du DrawerToggle. De cette façon, vous n'avez pas à ajouter le même code à chaque fragment.
la source
onBackPressed()
car je voulais le même comportement pour les deux.SUIVRE
La solution donnée par @dzeikei est soignée, mais elle peut être étendue, lors de l'utilisation de fragments, pour gérer automatiquement la remise à zéro de l'indicateur de tiroir lorsque la backstack est vide.
ÉDITER
Pour la question de @JJD.
Les fragments sont conservés / gérés dans une activité. Le code ci-dessus est écrit une fois dans cette activité, mais ne gère que le curseur vers le haut pour le
onOptionsItemSelected
.Dans l'une de mes applications, je devais également gérer le comportement du curseur haut lorsque le bouton de retour était enfoncé. Cela peut être géré en remplaçant
onBackPressed
.Notez la duplication de code entre
onOptionsItemSelected
etonBackPressed
qui peut être évitée en créant une méthode et en appelant cette méthode aux deux endroits.Notez également que j'ajoute encore deux fois
executePendingTransactions
ce qui dans mon cas était obligatoire ou bien j'avais parfois des comportements étranges du curseur haut.la source
mDrawerToggle
dans uneNavigationDrawerFragment
classe. Pour le faire fonctionner , je dois également basculer l'état du bouton d'accueil / indicateur - voir:NavigationDrawerFragment#toggleDrawerIndicator
. De plus, je ne suis pas sûr que vous ayez besoin de l'enregistrement initialonOptionsItemSelected
: je ne l'ai pas commenté. - Exemple simplifiéonOptionsItemSelected
. Cela garantit que le tiroir de navigation s'ouvre toujours dans la hiérarchie de niveau supérieur. Cependant, j'ai déplacé le code dans leNavigationDrawerFragment#onOptionsItemSelected
. Cela m'aide à ne pas exposermDrawerToggle
auMainActivity
.J'ai créé une interface pour l'activité d'hébergement pour mettre à jour l'état d'affichage du menu hamburger. Pour les fragments de niveau supérieur, j'ai défini la bascule sur
true
et pour les fragments pour lesquels je veux afficher la flèche vers le haut <sur laquelle j'ai réglé la basculefalse
.Puis dans mon activité ...
la source
Cette réponse fonctionnait mais il y avait un petit problème avec elle. Le
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
n'était pas appelé explicitement et cela provoquait le masquage de l'icône du tiroir même s'il n'y avait aucun élément dans la backstack, donc changer lasetActionBarArrowDependingOnFragmentsBackStack()
méthode fonctionnait pour moi.la source
La logique est claire. Afficher le bouton de retour si la pile de retour de fragment est vide. Afficher l'animation de retour de hamburger du matériau si la pile de fragments n'est pas claire.
la source
Si vous jetez un œil à l'application GMAIL et venez ici pour rechercher l'icône carret / d'affordance.
Je vous demanderais de le faire, aucune des réponses ci-dessus n'était claire. j'ai pu modifier la réponse acceptée.
NavigationDrawer -> Listview contient des sous-fragments.
les sous-fragments seront répertoriés comme ceci
firstFragment == position 0 ---> cela aura des sous-fragments -> fragment
Dans firstFragment, vous avez un autre fragment.
Appelez ça sur DrawerActivity
et en fragment
Dans la méthode d'activité OnBackPressed Drawer, définissez le bouton bascule du tiroir sur true pour réactiver l'icône de la liste de navigation.
Merci, Pusp
la source
Vous pouvez regarder ce petit exemple! https://github.com/oskarko/NavDrawerExample
la source
IMO, utiliser onNavigateUp () (comme indiqué ici ) dans la solution de riwnodennyk ou de Tom est plus propre et semble mieux fonctionner. Remplacez simplement le code onOptionsItemSelected par ceci:
la source