【问题标题】:Fragment transactions, actionbar & backstack片段交易、操作栏和后台堆栈
【发布时间】:2013-09-13 20:02:18
【问题描述】:

在我的主要活动中,我有一个带有NAVIGATION_MODE_TABS 的操作栏。每个选项卡的内容都是一个列表片段。

我想让它在单击列表项时显示一个新片段,并且操作栏模式更改为NAVIGATION_MODE_STANDARD(以便现在隐藏选项卡)。

我已经设法让它与以下代码一起工作:

在 listitemclick 方法中:

        ActionBar actionBar = getActivity().getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

        Fragment albumListFragment = new AlbumListFragment();
        albumListFragment.setArguments(bundle);
        FragmentTransaction ft = getFragmentManager().beginTransaction();

        ft.replace(android.R.id.content, albumListFragment);
        ft.addToBackStack(null);

        // Commit the transaction
        ft.commit();

        Log.i("FragmentList", "Item clicked: " + id);

问题是当我按下后退按钮时,选项卡仍然消失,并且之前的片段没有重新出现。

我是不是做错了什么......它与片段后台堆栈有关吗?我应该以另一种方式去做,甚至覆盖后压吗?

--编辑--

为了清楚起见 - 我在调用 fragmenttransaction.replace 时调用了 addToBackStack,但是当我按下后退按钮时,前一个片段没有恢复。

【问题讨论】:

标签: android android-fragments android-actionbar


【解决方案1】:

也许这有点晚了,我试图重建你的问题几个小时但没有成功。我尝试按照您的问题中描述的方式(即 ft.replace(android.R.id.content, albumListFragment);)从 ActionBar Tab 托管的片段中的列表视图切换到另一个视图,但没有效果。在一些谷歌和stackoverflow之后,我使用this way成功切换选项卡内的片段,但没有任何问题。

由于“操作栏显示不正确”的问题,这可能是由android developer guide 中描述的backstack revert 和UI 更改引起的。您可能会尝试覆盖 onBackStackChanged() 回调并重新构建 UI。

由于“backstack不带回之前的fragment”问题,你可能想多贴一点代码来帮助其他人重新构建问题以找到答案。

希望有所帮助。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题,并发现只有将 ActionBar 设置回 NAVIGATION_MODE_STANDARD 时才会出现问题。

    对我来说唯一的解决方案是将没有标签的新片段放在具有 NAVIGATION_MODE_STANDARD 的辅助活动中。然后您可以轻松地使用 Android 提供的返回按钮功能返回到带有 NAVIGATION_MODE_TABS 的 Activity 并保留其状态。

    【讨论】:

      【解决方案3】:

      FragmentTransaction.replace() 实际上移除了布局中的前一个片段并添加了该片段的新实例。

      尝试使用FragmentTransaction#show()FragmentTransaction#hide() 方法而不是替换。

      【讨论】:

      • 或者你可以使用 FragmentTransaction.detach()
      【解决方案4】:

      backstack 结束当前活动并转到上一个活动,而不是上一个片段。 (参见后台指南:http://developer.android.com/guide/components/tasks-and-back-stack.html)。

      您可以按照您的建议通过覆盖 onBackPressed 来强制执行该行为,但是,我不知道我会以这种方式更改自然的 Android 行为。如果您查看其他执行类似操作的应用程序,尤其是核心应用程序,则返回按钮不会转到上一个片段,而是转到上一个活动。

      您还可以完全控制“向上”按钮的行为(即操作栏上带有左箭头的应用图标)。您必须按照 ActionBar 指南中的描述以编程方式将其设置为用作按钮(如果您需要知道如何执行此操作,请告诉我),并且您可以让它在您的堆栈上设置上一个片段保持在某处。

      【讨论】:

      • 来自文档:但是,在调用 commit() 之前,您可能需要调用 addToBackStack(),以便将事务添加到片段事务的回栈。这个返回栈由 Activity 管理,并允许用户通过按下 Back 按钮返回到之前的片段状态。
      • @Frohnzie 对此表示感谢,但问题是我正在使用 addToBAckStack(),当我按下返回时它没有恢复上一个片段..
      • @rascuache 代码看起来正确。我做了同样的事情。我不确定问题是什么。使用 addToBackStack 是正确的。也许您可以发布更多代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多