7

在我的主要活动中,我有一个带有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,但是当我按下后退按钮时,前一个片段不会恢复。

4

4 回答 4

1

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

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

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

希望有帮助。

于 2013-09-13T12:02:18.103 回答
0

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

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

于 2012-09-11T09:24:58.467 回答
0

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

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

于 2012-12-22T05:18:25.787 回答
-1

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

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

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

于 2012-08-04T16:14:15.333 回答