【问题标题】:Android popBackStack() not restoring previous fragmentAndroid popBackStack()不恢复以前的片段
【发布时间】:2015-03-18 21:04:05
【问题描述】:

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

编辑: 如果我改变了

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

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

【问题讨论】:

  • 只有 super.onBackPressed();在 onBackPressed() 方法中并删除所有内容并检查
  • @krishna 然后应用程序在按下后退按钮时关闭。我需要检查片段是否存在于后堆栈中,如果存在则将其弹出。就我而言,它正在从堆栈中弹出一些东西,但它似乎不是/加载 mapFrag
  • 问题是,如果您将片段添加到 backstack,您不必检查它是否存在。 onBackpressed 它将从 backstack 中弹出存储的片段
  • @krishna 我明白你在说什么。当我打开应用程序备份。它会自动转到地图,所以它可能正在工作,但只是立即关闭应用程序
  • 我对这个带有片段的后台堆栈如何真正工作感到有些困惑。因此,作为一种解决方法,我不会将我的片段保存在 backstack 中并覆盖 onBackPressed 并用所需的片段替换我现有的片段

标签: java android android-fragments back-stack


【解决方案1】:

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

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

【讨论】:

  • 这几乎可以工作,但应用程序会在按下后立即关闭。虽然当我打开应用程序备份时,它在正确的位置。
  • 看到这个developer.android.com/guide/components/… 你有什么不同的吗?这应该可以正常工作
  • 记住super.onBackPressed() 可能会在您不想调用时调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多