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;
}
}
);
utilisation onSaveInstanceState pour enregistrer/réutiliser vos données EditText .. –