片段交易,行动栏&堆栈中

时间:2012-08-04 06:18:36

标签: android android-fragments android-actionbar

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

我想这样做,以便在点击列表项时,一个新的片段进入视图,并且操作栏模式更改为NAVIGATION_MODE_STANDARD(以便现在隐藏选项卡)。 / p>

我已设法使用以下代码:

在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 个答案:

答案 0 :(得分:1)

也许这有点晚了,我试着重新构建你的问题好几个小时但没有成功。我试图通过问题中描述的方式从ActionBar Tab托管的片段中的listview切换到另一个视图(即ft.replace(android.R.id.content,albumListFragment);)但没有效果。在一些google和stackoverflow之后,我使用this way成功切换选项卡中的片段,但没有问题。

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

由于“backstack没有带回前一个片段”问题,您可能需要发布更多代码以帮助其他人重新构建问题以找到答案。

祝愿有用。

答案 1 :(得分:0)

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

对我来说唯一的解决方案是在没有制表符的情况下将新片段放在具有NAVIGATION_MODE_STANDARD的辅助活动中。然后,您可以轻松使用Android提供的后退按钮功能,使用NAVIGATION_MODE_TABS返回活动并保持其状态。

答案 2 :(得分:0)

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

尝试使用FragmentTransaction#show()FragmentTransaction#hide()方法代替替换。

答案 3 :(得分:-1)

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

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

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