La commutation entre les Android Navigation Tiroir image et curseur lors de l'utilisation de fragments
Lors de l'utilisation de la Navigation Tiroir Android devs sont recommandant que, dans l'ActionBar "seuls les écrans qui sont représentés dans le Tiroir de Navigation devrait avoir le Tiroir de Navigation de l'image" et que "tous les autres écrans ont le traditionnel jusqu'à carat."
Voir ici pour les détails: http://youtu.be/F5COhlbpIbY
Je suis en utilisant une activité de contrôle de multiples niveaux de fragments et peut obtenir le Tiroir de Navigation de l'image à l'écran et la fonction à tous les niveaux.
Lors de la création de niveau inférieur fragments, je peux appeler le ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
pour masquer la Navigation image du Tiroir et ont la caret affiche
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 je vais avoir, c'est quand je retourner au niveau supérieur des fragments de la Place carats montre encore la place de la Navigation d'origine image du Tiroir. Toutes les suggestions sur la façon de "rafraîchir" la ActionBar sur le haut niveau des fragments de ré-afficher la Navigation image du Tiroir?
Solution
Tom suggestion a fonctionné pour moi. Voici ce que j'ai fait:
MainActivity
Cette activité de contrôle tous les fragments dans l'application.
Lors de la préparation de nouveaux fragments de remplacer d'autres, j'ai mis 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();
Prochaine, en remplacement de onBackPressed
, j'ai repris les ci-dessus par le réglage de la 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 LowerLevelFragments
Dans les fragments que j'ai modifié onCreate
et onOptionsItemSelected
comme ceci:
Dans onCreate
ajouté setHasOptionsMenu(true)
pour permettre la configuration du menu options. Également définir setDisplayHomeAsUpEnabled(true)
pour activer la < dans l'actionbar:
@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);
}
Puis dans onOptionsItemSelected
chaque fois que le < est pressé il appelle la onBackPressed()
de l'activité pour remonter d'un niveau dans la hiérarchie et l'affichage de la Navigation à l'Image du Tiroir:
@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;
…
}
- Aussi dans votre onBackPressed() la méthode, vous pouvez vérifier le nombre d'entrées dans la pile de retour avec getFragmentManager().getBackStackEntryCount() la méthode et permettre tiroir indicateur uniquement si le résultat est 0. Dans ce cas, il est inutile d'activer homeAsUpIndicator dans chaque LowerLevelFragments.
- C'est très utile! Vous devez déplacer la "solution" partie de votre post et d'en faire une véritable "réponse". Vous obtiendrez plus de points pour les upvotes et il est une réponse après tout
- Pourquoi êtes-vous remplacer le fragment ici:
.replace(R.id.frag_layout
. Si c'est un autre niveau de la hiérarchie je m'attends à ce que vous.add
à la backstack. - Vous aime pour cette question <3
- Bro, comment faites-vous référence à la
theDrawerToggle.setDrawerIndicatorEnabled(false);
à l'intérieur du fragment? Je pense qu'il est déclaré dans l'Activité Principale de fichier de classe. Je ne peux pas trouver un moyen de faire référence à ce. Tous les conseils? - Lors de l'utilisation d'une barre d'outils j'ai dû changer les options d'affichage de ne pas utiliser la maison comme dans le même temps. Sinon, le
setDisplayOptions()
méthode au sein de laToolbarWidgetWrapper
(de l'intérieur de l'android.de soutien.v7.interne.widget de paquet) ne serait pas recréer l'icône lors de la saisie de la même fragment un deuxième temps. En laissant ce ici pour, lorsque les autres de tomber sur ce problème. - Rittmeyer, pourriez-vous expliquer en détail ce que vous avez fait pour résoudre le problème lors de l'utilisation de la barre d'outils?
Vous devez vous connecter pour publier un commentaire.
Vous avez écrit que, pour mettre en œuvre de niveau inférieur fragments, vous êtes en remplaçant le fragment, par opposition à la mise en œuvre au niveau inférieur, le fragment dans une nouvelle activité.
Je pense que vous devriez mettre en œuvre la fonctionnalité manuellement: lorsque l'utilisateur appuie sur le dos, vous disposez d'un code qui s'affiche la pile (par exemple, dans
Activity::onBackPressed
remplacer). Donc, partout où vous le faites, vous pouvez inverser lasetDrawerIndicatorEnabled
.C'est simple comme 1-2-3.
Si vous souhaitez obtenir:
1) Tiroir Indicateur - en l'absence de fragments sont dans la Pile de Retour ou le Tiroir est ouvert
2) Flèche - lorsque certains Fragments sont dans la Pile de Retour
3) les Deux indicateurs d'agir en fonction de leur forme
P. S. Voir La création d'un Tiroir de Navigation sur les Développeurs Android sur d'autres conseils sur les 3 lignes de l'indicateur de comportement.
setActionBarArrowDependingOnFragmentsBackStack()
... quel nom long 😛J'ai utilisé de la chose suivante: l'
drawerToggle.setToolbarNavigationClickListener(
cet écouteur est appelée lors d'un clic sur la flècheSi votre action bouton de la barre ne fonctionne pas, n'oubliez pas d'ajouter l'écouteur :
J'ai quelques difficultés à la mise en œuvre d'un tiroir de navigation avec un bouton de la maison, tout a fonctionné à l'exception de l'action buton.
Essayer la manipulation de la Maison de la sélection de l'élément dans le MainActivity en fonction de l'état de la DrawerToggle. De cette façon, vous n'avez pas à ajouter du même code pour chaque fragment.
onBackPressed()
parce que je voulais le même comportement pour les deux.SUIVI
La solution donnée par @dzeikei est soignée, mais il peut être prolongé, lors de l'utilisation de fragments, afin de traiter automatiquement le tiroir de témoin lors de la backstack est vide.
MODIFIER
Pour la question de @JJD.
Les fragments sont détenus ou gérés dans une activité. Le code ci-dessus est écrit une fois dans cette activité, mais seulement gérer les signe pour la
onOptionsItemSelected
.Dans une de mes applications, j'ai également nécessaire pour gérer le comportement du curseur lors de l'arrière bouton a été pressé. Cela peut être gérer par des raisons impérieuses
onBackPressed
.Note la duplication de code entre
onOptionsItemSelected
etonBackPressed
qui peut être évitée par la création d'une méthode et de l'appel de la méthode dans les deux endroits.Notez également que je ajouter deux fois de plus
executePendingTransactions
qui dans mon cas était nécessaire, ou autre, j'ai parfois des comportements étranges de l'accent circonflexe.mDrawerToggle
dans unNavigationDrawerFragment
classe. Pour le faire fonctionner j'ai besoin de passer à l'état de la maison du bouton/indicateur - voir:NavigationDrawerFragment#toggleDrawerIndicator
. De plus, je ne suis pas sûr que vous avez besoin de la vérification initiale deonOptionsItemSelected
: j'ai décommenté il. - exemple SimplifiéonOptionsItemSelected
. Cela garantit que la Navigation Tiroir s'ouvre dans la hiérarchie de niveau supérieur. Cependant, j'ai déplacé le code dans leNavigationDrawerFragment#onOptionsItemSelected
. Cela m'aide à ne pas exposer lesmDrawerToggle
à laMainActivity
.J'ai créé une interface pour l'activité d'hébergement de mettre à jour l'état d'affichage de l'hamburger menu. De haut niveau fragments-je régler l'interrupteur à
true
et de fragments pour laquelle je veux afficher les up < arrow-je régler l'interrupteur àfalse
.Ensuite dans mon Activité ...
Ce réponse fonctionnait, mais il y avait un petit problème avec elle.
Le
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
n'a pas été appelé explicitement, et cela a provoqué tiroir icône pour être caché, même quand il n'y avait pas d'articles dans la backstack la modification dusetActionBarArrowDependingOnFragmentsBackStack()
méthode a fonctionné pour moi.Logique est claire.
Montrer bouton de retour si fragment de la pile de retour est clair.
Afficher les hamburger-l'animation si le fragment de la pile n'est pas clair.
Si vous jetez un oeil à l'application GMAIL et viennent ici à la recherche de la carret/affordance icône..
Je voudrais vous demander de le faire, aucune de ces réponses réponse était claire. j'ai été en mesure de modifier la accepté de répondre.
NavigationDrawer --> Listview contient subfragments.
subfragments sera répertorié comme ce
firstFragment == position 0 ---> ce qui aura subfragments --> fragment
Dans firstFragment vous avez d'autres fragment.
Appeler ce sur DrawerActivity
et du fragment
Sur le OnBackPressed Tiroir de l'activité de la méthode de régler le tiroir de la bascule à true pour activer la liste de navigation icône de nouveau.
Grâce,
Pusp
Vous pouvez regarder ce petit exemple!
https://github.com/oskarko/NavDrawerExample
De l'OMI, à l'aide de onNavigateUp() (comme illustré ici) dans riwnodennyk ou de Tom solution est plus propre et semble mieux fonctionner. Il suffit de remplacer le onOptionsItemSelected avec ce code: