0

J'ai une activité avec un Framelayout et un BottomNavigationView ... J'ai 4 fragments (A, B, C, D) ... La chose est quand je passe de A à B après avoir cliqué sur l'élément de menu pour charger le fragment B, le fragment A est détruit ... J'ai ajouté un message Log sur toutes les méthodes de callback (OnAttach, OnCreate, OnCreateView ..... etc) impliquées dans le cycle de vie Fragment et onDestroyView est toujours appelé quand je change de fragments ... Alors, quand je reviens à un fragment déjà ouvert, onCreateView est appelé à nouveau ..Les fragments sont recréés sur l'élément de modification bottomnavigationview cliquez sur

Voilà ma classe d'activité:

public class Home extends AppCompatActivity 
{ 
    private BottomNavigationView.OnNavigationItemSelectedListener 
mOnNavigationItemSelectedListener 
     = new BottomNavigationView.OnNavigationItemSelectedListener() { 

    @Override 
    public boolean onNavigationItemSelected(@NonNull MenuItem item) 
    { 
     Fragment fragment = null; 
     Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
     switch (item.getItemId()) 
     { 
      case R.id.navigation_a: 
       if (!(currentFragment instanceof FragmentA)) 
        fragment = FragmentA.newInstance(); 
       break; 
      case R.id.navigation_b: 
       if (!(currentFragment instanceof FragmentB)) 
        fragment = FragmentB.newInstance(); 
       break; 
      case R.id.navigation_c: 
       if (!(currentFragment instanceof FragmentC)) 
        fragment = FragmentC.newInstance(); 
       break; 
      case R.id.navigation_d: 
       if (!(currentFragment instanceof FragmentD)) 
        fragment = FragmentD.newInstance(); 
       break; 
     } 

     if (fragment != null) { 
      getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit(); 
      return true; 
     } 

     return false; 
    } 

}; 


//TODO Handle life-cycle methods when switching between fragments 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 
    Toolbar toolbar = findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction() 
      .add(R.id.fragment_container, FragementA.newInstance()) 
      .commit(); 
    fm.popBackStack(); 

    BottomNavigationView navigation = findViewById(R.id.navigation);  navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 
} 

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    { 
     moveTaskToBack(true); 
     return true; 
     } 

    return false; 
    } 

} 

J'aimerais savoir ce qui me manque ici ... Merci d'avance

+0

@Claude ... L'avez-vous compris? – GvSharma

+0

@GvSharma .... Je suis vraiment désolé pour mon retard de réponse mate !! ... En fait, j'ai utilisé un viewpager à l'intérieur .. Je n'ai pas eu le temps de tester les idées proposées ci-dessous car j'étais dans une hâte .. .Mais je pense que l'ajout du fragment au backstack résout définitivement le problème ... –

Répondre

0

Essayez d'utiliser setRetainInstance(true); pour vos fragments.

// this method is only called once for this fragment 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // retain this fragment 
    setRetainInstance(true); 
} 
+0

Ouais ... en fait j'ai déjà essayé ça avant de poster mon problème ici ... Ça ne semble pas faire l'affaire –

1

bien que vous n'ajoutez pas le fragment au backstack.

1

Vous créez de nouvelles instances à chaque clic. Ne conservez la référence à ceux que vous souhaitez remplacer par le même OU ajoutez alors au backstack de la fragmentransaction, mais vous aurez besoin d'étiquettes pour naviguer à travers les précédentes.