Вернуться к предыдущему фрагменту без воссоздания фрагмента - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть действие, которое включает навигацию Bottom, которая открывает 3 отдельных фрагмента:

  • Фрагмент А
  • Фрагмент Б
  • Фрагмент С

Когда Fragment A открылся, нажатием кнопки я открываю другой фрагмент (фрагмент G), теперь, если я нажму кнопку «Назад», я вернусь к Fragment A. Но этот фрагмент (A) воссоздан. Я хочу вернуться в то же состояние и не создавать заново фрагмент.

Это мой код в MainActivity:

 private void loadFragment (Fragment fragment){
        String backStateName =  fragment.getClass().getName();
        String fragmentTag = backStateName;

        FragmentManager manager = getSupportFragmentManager();
        boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);

        if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null){ //fragment not in back stack, create it.
            FragmentTransaction ft = manager.beginTransaction();
            ft.replace(R.id.frame_container, fragment, fragmentTag);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(backStateName);
            ft.commit();
        }
    }
@Override
    public void onBackPressed(){
        if (getSupportFragmentManager().getBackStackEntryCount() == 1){
            finish();
        }
        else {
            super.onBackPressed();
        }
    }

и это мой код во Фрагменте А, который открывает Фрагмент G

private void loadFragment() {
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        Fragment fragment;
                fragment = new PdfFragment();
            transaction.replace(R.id.frame_container, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Прежде всего, вы знаете тег вашего фрагмента. Предположим, у вас есть два фрагмента

- FragmentA.java
- FragmentB.java

Вы хотите вернуться от фрагмента B к фрагменту A, затем вы должны добавить

fragmentTransaction.addToBackStack("FragmentA");

Теперь я думаю, что это сработает.

0 голосов
/ 07 ноября 2018

в вашем фрагменте просто добавьте этот код в OnCreateView

 if (view != null){
                if((ViewGroup)view.getParent() != null)
                    ((ViewGroup) view.getParent()).removeView(view);
                return view;
            }
0 голосов
/ 05 ноября 2018

Это возможно, если вы объявите все свои экземпляры Fragment глобально. Звоните всем своим fragment с activity.

Например: - Работает в activity.

 private Fragment fragmentA =  new FragmentA();
 private Fragment fragmentB =  new FragmentB();
 private Fragment fragmentC =  new FragmentC();


public void callFragment1() {
    fragmentManager.beginTransaction().replace(R.id.layout, fragmentA).addToBackStack(null).commit();
}

Например: - работает в fragment.

MyActivity activity = ((MyActivity)getActivity());
activity.callFragment1();

И так далее для других fragments.

Надеюсь, ваша проблема решится.

...