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 dans ToolbarWidgetWrapper
(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.