0

J'ai un tiroir de navigation dans l'activité principale de mon application. Sur la méthode onCreate de l'activité I initialise un des fragments comme celui-ci:Android Navigation Drawer mauvais titre de la barre d'outils onResume

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (savedInstanceState == null) { 
     MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_history); 
     openFragment(menuItem); 
    } 

public void openFragment(MenuItem menuItem){ 
    Fragment newFragment = null; 

    switch (menuItem.getItemId()){ 
     case R.id.menu_history : 
      newFragment = new HistoryFragment(); 
      break; 
     //..... 
    } 

    if (newFragment != null){ 
     //Replace content frame in activity_main.xml with newFragment 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.content_frame, newFragment) 
       .commit(); 

     menuItem.setChecked(true); 
     getSupportActionBar().setTitle(menuItem.getTitle()); 
    } 

    drawerLayout.closeDrawers(); 
} 

Tout cela fonctionne bien, le fragment apparaît au démarrage avec le titre de la barre d'outils étant « Histoire ». Mais lorsque l'application passe à onPause, puis à OnResume, le titre de la barre d'outils passe de "Historique" au nom de l'application. Je soupçonne que c'est un problème avec onResume ne pas ouvrir le fragment/retour à son état précédent correctement, parce que quand j'ai ajouté les lignes suivantes à onResume la question est arrêté:

@Override 
protected void onResume() { 
    super.onResume(); 
    MenuItem menuItem = navigationView.getMenu().findItem(R.id.menu_history); 
    openFragment(menuItem); 
} 

Cette solution semble fixer, mais cela signifie qu'il doit recharger le fragment avec les animations chaque fois que l'application est reprise, ce qui n'est pas optimal. Des idées pour résoudre le problème? Si cela aide, pour recréer le problème que j'ai trouvé utile de faire l'écran partagé de l'application, car il appelle toujours onResume. Merci.

Répondre

1

l'intérieur de votre méthode openFragment(), vous écrivez:

getSupportActionBar().setTitle(menuItem.getTitle()); 

Ceci est la seule chose qui change le titre de votre barre d'outils.

Notez que ce code n'a rien à voir avec votre Fragment s, en soi. Lorsque votre activité est détruite et recréée, le Fragment actif sera détruit (automatiquement) et recréé avec succès par le FragmentManager ... mais votre méthode openFragment() ne fonctionnera plus et rien ne mettra à jour le titre de votre barre d'outils.

Il y a plusieurs façons de résoudre ce problème. La bonne chose à faire est probablement de mettre à jour le titre de votre barre d'outils dans l'une des méthodes de cycle de vie de votre Fragment.

Edit: Un endroit raisonnable pour mettre à jour le titre de votre barre d'outils serait dans la méthode onActivityCreated() de votre fragment. Cela fonctionnera à la fois lorsque le fragment est ajouté pour la première fois et pendant la récréation. Quelque chose comme:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("hello world"); 
}