Навигация просмотра фрагментов и дочернего backstack
Ранее я обрабатывал фрагменты, но это было с помощью пейджера представления и табуляции, и я смог сохранить состояние фрагментов, создав массив и вернув фрагмент из этого массива.
но теперь, используя диспетчер фрагментов, у меня есть доступ к добавлению и замене, но оба создают новые экземпляры моих фрагментов без сохранения того, что произошло (например, набрав на editText).
Как я могу сохранить или повторно использовать фрагменты, которые я создал при навигации по меню (имейте в виду, что у некоторых из этих фрагментов будет дочерний backstack, кнопка "назад" должна выводить вас только из глубоких фрагментов, а не из моих основных)
текущий код
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;
}
}
);
}
Редактировать решено:
Я обнаружил, что для сохранения вида он должен иметь идентификатор (имеет смысл). Также я не использовал .commit()
с некоторыми из моих .replace
в моем предыдущем коде
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;
}
}
);
2 ответа
Мне непонятно с вашим вопросом. Но это как сохранить backState фрагментов.
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();
Как вы могли сохранить данные Fragment
уходя от него я думаю ты уже знаешь о SavedInstanceState
, Во всяком случае, пока вы проводите один фрагмент в другой от вашего Activity
используя фрагмент транзакции, вам нужно добавить addToBackStack(null)
перед вашим коммитом. Так что транзакция должна выглядеть так
fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").addToBackStack(null).commit();
И переопределить onBackPressed
функция вашего Activity
как это.
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0)
getSupportFragmentManager().popBackStack();
else
super.onBackPressed();
}