片段事务,操作栏和返回堆栈

7
在我的主活动中,我有一个具有NAVIGATION_MODE_TABS的操作栏。每个选项卡的内容都是一个列表片段。
我想让当列表项被点击时,一个新的片段被带到视图中,并且操作栏模式被改为NAVIGATION_MODE_STANDARD(这样选项卡现在就会隐藏)。
我已经使用以下代码成功实现了此目标:
在列表项单击方法中:
        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);

问题在于当我按下返回按钮时,选项卡仍然消失,之前的片段也没有恢复到视图中。

我做错了什么吗..这与片段回退栈有关吗?我应该采取其他方法,甚至重写backpress吗?

--编辑--

为了清晰起见 - 当我调用fragmenttransaction.replace时,我调用addToBackStack,但是当我按下返回按钮时,之前的片段没有被恢复。


请查看此链接:http://www.vogella.com/articles/Android/article.html#fragments_tutorial - shassss
谢谢,但这并没有对这个问题有什么特别的帮助。 - Tim Malseed
使用addToBackStack是你想要的。http://developer.android.com/guide/components/fragments.html#Transactions - Frohnzie
你可以尝试使用 ft.addToBackStack("fragment_tag"); 而不是 ft.addToBackStack(null); 吗? - pRaNaY
4个回答

1
也许有点晚了,我花了几个小时试图重构您的问题,但没有成功。我尝试从由ActionBar Tab托管的片段中的ListView切换到另一个视图,方法如您所述(即ft.replace(android.R.id.content, albumListFragment);),但没有效果。经过一些谷歌和stackoverflow的搜索,我使用这种方式成功地在选项卡内切换片段,但没有像您那样的问题。
关于“操作栏未正确显示”的问题,它可能是由于回退堆栈还原和UI更改导致的,正如Android开发人员指南中所描述的那样。您可以尝试覆盖onBackStackChanged()回调并重新构建UI。
至于“回退堆栈不能将上一个片段带回”的问题,您可能需要发布更多代码以帮助其他人重构问题以找到答案。
祝您有所帮助。

0

或者您可以使用FragmentTransaction.detach()。 - AlikElzin-kilaka

0

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

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


-1

返回栈会结束当前 Activity,而不是前一个 Fragment。(请参见返回栈指南:http://developer.android.com/guide/components/tasks-and-back-stack.html)。

你可以像你所建议的那样通过重写 onBackPressed 方法来强制实现这种行为,不过我不确定我是否会以这种方式更改 Android 的自然行为。如果你看一下其他应用程序,特别是核心应用程序,做类似事情的后退按钮不会回到上一个 Fragment,而是回到上一个 Activity。

此外,你可以完全控制“向上”按钮(即在操作栏上带有左箭头的应用程序图标)的行为。按照 ActionBar 指南中描述的方式编程设置它以被用作按钮(如果需要了解如何执行此操作,请告诉我),然后你就可以将其设置为在某个地方维护的堆栈上的前一个 Fragment。


从文档中得知:在调用commit()之前,您可能需要调用addToBackStack(),以将事务添加到片段事务的后退堆栈中。此后退堆栈由活动管理,并允许用户通过按返回按钮返回到先前的片段状态。 - Frohnzie
@Frohnzie 谢谢你的回复,但问题是我正在使用addToBackStack(),但当我按返回键时它并没有恢复之前的片段。 - Tim Malseed
@rascuache 代码看起来正确。我也做了完全相同的事情。我不确定问题出在哪里。使用addToBackStack是正确的做法。也许你可以发布更多的代码。 - Frohnzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接