2017-09-30 5 views
1

J'ai traité des fragments auparavant, mais avec un pagineur de vue et un tablayout et j'ai pu conserver l'état des fragments en construisant un tableau et en renvoyant un fragment de ce tableau. Mais maintenant, en utilisant le gestionnaire de fragments, j'ai accès à l'ajout et au remplacement, mais tous deux créent de nouvelles instances de mes fragments sans sauvegarder ce qui s'est passé (c'est-à-dire en tapant editText). Comment puis-je conserver ou réutiliser les fragments que j'ai créés en naviguant depuis le menu (gardez à l'esprit que certains de ces fragments auront un backstack enfant, le bouton retour ne devrait vous sortir que des fragments profonds et non pas mes principaux)Fragments de vue de navigation et backstack enfant

code actuel

private void initNavigation(){ 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    /* Initialize fragments for navigation drawer */ 
    fragments = new Fragment[]{ 
      new ProfileFragment(), 
      new StatsFragment()}; 

    /* Set selection of navigation item */ 
    nav_view = (NavigationView) findViewById(R.id.nav_view); 
    nav_view.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        item.setChecked(true); 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        switch (item.getItemId()) { 
         case R.id.nav_routine: 
          if(fragmentManager.findFragmentByTag("TAG0") != null){ 
           Log.i("fm", "reloading profile frag"); 
           fragmentManager.beginTransaction().replace(R.id.content_main, 
             fragmentManager.findFragmentByTag("TAG0"), "TAG0"); 
          } else{ 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit(); 
          } 
          break; 
         default: 
          if(fragmentManager.findFragmentByTag("TAG1") != null){ 
           Log.i("fm", "reloading stats frag"); 
           fragmentManager.beginTransaction().replace(R.id.content_main, 
             fragmentManager.findFragmentByTag("TAG1"), "TAG1"); 
          } else{ 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit(); 
          } 
          break; 
        } 

        drawerLayout.closeDrawers(); 
        return true; 
       } 
      } 
    ); 
} 

Modifier résolu:

j'ai découvert que pour une vue à enregistrer, il doit avoir une carte d'identité (logique). Aussi je n'utilisais pas .commit() avec certains de mes .replace dans mon code avant

nav_view.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        item.setChecked(true); 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        switch (item.getItemId()) { 
         case R.id.nav_routine: 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit(); 
          break; 
         default: 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit(); 
          break; 
        } 

        drawerLayout.closeDrawers(); 
        return true; 
       } 
      } 
    ); 
+0

utilisation onSaveInstanceState pour enregistrer/réutiliser vos données EditText .. –

Répondre

0

Je ne suis pas clair avec votre question .Mais c'est ainsi tenue backState des fragments.

Fragment mfragment=new Fragmentname();   

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_container, mfragment); 
     String backStateName = mfragment.getClass().getName(); 
     if (position != 0) { 
      ft.addToBackStack(backStateName); 
     } 

     ft.commit(); 
0

Comme vous pouvez enregistrer les données d'un Fragment en sortant de là, je pense que vous connaissez déjà SavedInstanceState. Quoi qu'il en soit, pendant que vous transigez un fragment à un autre à partir de votre transaction fragmentée, vous devez ajouter addToBackStack(null) avant votre validation. Ainsi, la transaction devrait ressembler à

fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").addToBackStack(null).commit(); 

Et remplacer la fonction onBackPressed de votre Activity comme ça.

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) 
     getSupportFragmentManager().popBackStack(); 
    else 
     super.onBackPressed(); 
} 
+0

Je veux dire, lors de la navigation entre les fragments dans le menu avant et en arrière, je dois garder tout ce que je changé. Je sais que pour les fragments enfant (fragments profonds) je peux utiliser getChildFragmentManager pour que chaque fragment principal puisse avoir sa propre pile arrière. – John