Android popBackStack() не восстанавливает предыдущий фрагмент

У меня есть два фрагмента MapScreenFragment и SessionSetUpFragment, которые входят и выходят из моей активности MapsActivity. Я всегда сначала иду к MapScreenFragment, а затем на MapScreenFragment будет кнопка, которая вызывает MapsActivity и заменяет текущий фрагмент на SessionSetUpFragment. Таким образом, стек диспетчера фрагментов должен иметь SessionSetUpFragment, а затем MapScreenFragment. Когда я нажимаю кнопку возврата Android на SessionSetUpFragment, он показывает пустой экран, а onCreateView() или onResume() MapScreenFragment никогда не вызывается. Другой вызов кнопки «Назад» в Android закроет приложение. Как мне возобновить работу MapScreenFragment?

Изменить: если я изменю

getFragmentManager().popBackStack("sessFrag", FragmentManager.POP_BACK_STACK_INCLUSIVE);

to

getFragmentManager().popBackStack();

Проблема все еще существует, но у меня есть еще один пустой задний экран, который нужно просмотреть, прежде чем приложение закроется.

введите здесь описание изображениявведите здесь описание изображения

MapScreenFramget.java:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_map, container, false);

    Log.d(TAG,"onCreateView"); //Never gets called
}

@Override
public void onResume() {
    Log.d(TAG,"onResume"); //Never gets called
    super.onResume();
}

MapsActivity.java:

 @Override
 public void logIn(){
     MapScreenFragment mapFrag = new MapScreenFragment();
     getFragmentManager().beginTransaction().replace(R.id.mainContainer, mapFrag).addToBackStack("mapFrag").commit();
 }

 @Override
 public void sessionSetUp(){
     SessionSetUpFragment sessFrag = new SessionSetUpFragment();
     getFragmentManager().beginTransaction().replace(R.id.mainContainer, sessFrag).addToBackStack("sessFrag").commit();
 }

@Override
public void onBackPressed() {
    if(fm.getBackStackEntryCount() > 0) {
        Log.i(TAG, fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1) + " Popped! " + (fm.getBackStackEntryCount() - 1) + " stacks left!");

        getFragmentManager().popBackStack("sessFrag", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }else {
        super.onBackPressed();
    }
}

person Community    schedule 18.03.2015    source источник
comment
есть только super.onBackPressed(); в методе onBackPressed() и удалите все и проверьте   -  person krishna    schedule 19.03.2015
comment
@krishna Тогда приложение просто закрывается при нажатии кнопки «Назад». Мне нужно проверить, существует ли фрагмент в заднем стеке, и удалить его, если это так. В моем случае он выталкивает что-то из стека, но это не похоже на загрузку mapFrag   -  person    schedule 19.03.2015
comment
Дело в том, что если вы добавляете фрагмент в стопку, вам не нужно проверять, существует ли он или нет. onBackpressed вытолкнет сохраненный фрагмент из стопки   -  person krishna    schedule 19.03.2015
comment
@krishna Я понял, о чем ты говоришь. Когда я снова открываю приложение. он автоматически переходит на карту, так что, возможно, он работает, но просто сразу закрывает приложение   -  person    schedule 19.03.2015
comment
Я немного смущен тем, как на самом деле работает этот backstack с фрагментами. Поэтому в качестве обходного пути я не сохраняю свои фрагменты в бэкстеке, переопределяю onBackPressed и заменяю существующий фрагмент желаемым фрагментом.   -  person krishna    schedule 19.03.2015
comment
@krishna Вы просто сохраняете все свои фрагменты и заменяете их снова и снова? Это что-то портит?   -  person    schedule 19.03.2015
comment
Нет, все работает нормально, я ничего не сохраняю, см. это github.com/ktv205/ThreeFragmentActivity/blob/master/src/com/   -  person krishna    schedule 19.03.2015


Ответы (1)


Поскольку MapScreenFragment — это ваш первый фрагмент, вы можете попробовать вызвать add() вместо replace() в методе login(). И не добавляйте его в backstack. Добавление MapScreenFragment в задний стек приводит к пустому пространству, которое вы видите.

Далее ваш метод sessionSetUp() выглядит нормально. Поскольку вы уже добавили SessionSetUpFragment в backStack, вам не нужно переопределять onBackPressed(). Это всегда работало для меня.

person Varun    schedule 18.03.2015
comment
Это почти работает, но приложение сразу же закрывается при обратном нажатии. Хотя, когда я снова открываю приложение, оно находится в нужном месте. - person ; 19.03.2015
comment
См. это developer.android.com/guide/components/. что-то другое вы делаете? Это должно просто работать - person Varun; 19.03.2015
comment
Имейте в виду super.onBackPressed(), который может быть вызван, когда вы этого не хотите. - person George Daramouskas; 26.04.2015