【问题标题】:How to add Fragments to back stack in Android如何在 Android 中将 Fragments 添加到后台堆栈
【发布时间】:2014-03-05 12:13:42
【问题描述】:

我使用 Sherlock Fragment 创建了一个有五个屏幕的应用。

我可以从一个屏幕跳到任何其他屏幕。

但我想将上次访问的片段名称保存到后台堆栈,以便从当前片段我可以跳回父片段(我来自哪里)。

我试过这段代码,

    FragmentManager fragManager = getActivity().getSupportFragmentManager();
    FragmentTransaction fragTransacion = fragManager.beginTransaction();

    FragmentManager.BackStackEntry backEntry=getFragmentManager().getBackStackEntryAt(getActivity().getFragmentManager().getBackStackEntryCount());
    String str=backEntry.getName();
    fragTransacion.addToBackStack(str);

但不幸的是我的程序停止并告诉我 NullPointerException 在那里

我怎样才能做到这一点?

这是我的日志猫, logcat

【问题讨论】:

  • 请发布你的日志
  • AboutUs.java 的第 44 行有什么内容?

标签: android android-fragments back-stack


【解决方案1】:

你可以这样做

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.content, fragment);
transaction.addToBackStack("");
transaction.commit();

【讨论】:

  • 这对我帮助很大。谢谢!
【解决方案2】:

在任何地方都使用getSupportFragmentManager(),而不是getFragmentManager()

替换

   FragmentManager.BackStackEntry backEntry=getFragmentManager().getBackStackEntryAt(getActivity().getFragmentManager().getBackStackEntryCount());

   FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(getActivity().getSupportFragmentManager().getBackStackEntryCount());

另外你需要在添加到 backstack 之前执行一些事务

FragmentManager fragManager = getActivity().getSupportFragmentManager();
    FragmentTransaction fragTransacion = fragManager.beginTransaction();

    FragmentManager.BackStackEntry backEntry=getFragmentManager().getBackStackEntryAt(getActivity().getFragmentManager().getBackStackEntryCount());
    String str=backEntry.getName();
fragTransacion.add(R.id.content_frame, detailFrag);
    fragTransacion.addToBackStack(str);

fragTransacion.commit();

此外,您可能应该使用count -1 在计数索引处获取项目可能会给出ArrayIndexOutOfBounds

【讨论】:

  • 这里的“fragTransacion.add(R.id.content_frame, detailFrag)”有什么用?
  • 您进行的任何交易。它只是一个例子。首先尝试解决我提到的其他错误。
【解决方案3】:

你得到了NullPoinerException,因为你试图在片段未初始化时获取 backEntry(添加片段后需要等到它被加载。此外,你需要先将片段附加到活动fragTransacion.replace(R.id.yoursLayout,new YoursFragment);,然后添加到后台堆栈 而是:

 FragmentManager.BackStackEntry backEntry=getFragmentManager().getBackStackEntryAt(getActivity().getFragmentManager().getBackStackEntryCount());
        String str=backEntry.getName();
fragTransacion.addToBackStack(str);

使用这个:

fragTransacion.addToBackStack(null);

【讨论】:

  • 但是我如何使用“fragTransacion.replace(R.id.yoursLayout,new YoursFragment)” bcz 我的目标片段没有修复
  • 只需添加 fragTransacion.addToBackStack(null);添加目标片段后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多