Android popBackStack()没有恢复以前的片段

时间:2015-03-18 21:04:05

标签: java android android-fragments back-stack

我有两个片段MapScreenFragment和SessionSetUpFragment,它们与我的活动MapsActivity一起进出。我总是首先去MapScreenFragment,然后在MapScreenFragment上会有一个按钮,它回调到MapsActivity并用SessionSetUpFragment替换当前片段。因此片段管理器堆栈应该具有​​SessionSetUpFragment,然后是MapScreenFragment。当我点击SessionSetUpFragment上的android后退按钮时,它显示一个空白屏幕,并且从不调用MapScreenFragment的onCreateView()或onResume()。然后另一个Android后退按钮调用将关闭该应用程序。如何恢复MapScreenFragment?

修改 如果我改变

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

getFragmentManager().popBackStack();

问题仍然存在,但在应用关闭之前我还有一个额外的空白后屏幕

enter image description here enter image description here

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();
    }
}

1 个答案:

答案 0 :(得分:1)

由于MapScreenFragment是您的第一个片段,您可能需要尝试在add()方法中调用replace()而不是login()。并且不要将它添加到后台堆栈中。将MapScreenFragment添加到backstack会导致您看到的空白区域。

接下来,您的sessionSetUp()方法看起来不错。 由于您已将SessionSetUpFragment添加到backStack,因此您无需覆盖onBackPressed()。这一直对我有用。