Навигация просмотра фрагментов и дочернего 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();
}
Другие вопросы по тегам