Android FragmentTabHost popBackStack() 导致 IllegalStateException Fragment 已添加
Posted
技术标签:
【中文标题】Android FragmentTabHost popBackStack() 导致 IllegalStateException Fragment 已添加【英文标题】:Android FragmentTabHost popBackStack() caused IllegalStateException Fragment already added 【发布时间】:2014-11-22 20:42:37 【问题描述】:我的 android 应用正在使用 FragmentTabHost,并且有 4 个选项卡 A、B、C、D。 我在带有片段 A1 的标签 A 中,我导航到标签 A 中的第二个片段 A2, 然后我切换到选项卡 B,然后切换回选项卡 A。 现在我单击将调用 popBackStack() 方法的后退按钮,我得到了崩溃,说 IllegalStateException Fragment A1 已经添加。 你能帮我吗? 这是我用来在 Main Tab Activity 中创建标签的代码,
mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
mTabHost.addTab(mTabHost.newTabSpec("profile").setIndicator("Profile"),
ProfileFragment.class, null);
mTabHost.addTab(mTabHost.newTabSpec("friends").setIndicator("Friends"),
FriendsFragmentTab.class, null);
mTabHost.addTab(
mTabHost.newTabSpec("notifications").setIndicator(
"Notifications"), NotificationFragment.class, null);
mTabHost.setOnTabChangedListener(new OnTabChangeListener()
public void onTabChanged(String tabID)
mTabHost.clearFocus();
);
我使用这段代码来处理后退按钮按下,FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack();
【问题讨论】:
请发布您的代码! 我刚刚更新了我的帖子。谢谢 【参考方案1】:看起来一般的答案是“制作你自己的后台堆栈”。这可能取决于每个选项卡上片段的内容是什么,但在我的情况下,内容本身具有子片段,这些子片段似乎妨碍了后堆栈正常工作。
我做了一些研究,发现了这篇来自 Android 团队成员的帖子:https://***.com/a/8888195/91165
除非您的应用程序具有复杂的导航流程和许多可能的反向方向,否则直接处理导航状态可能比使用堆栈更容易。 (在我的情况下,堆栈只会有一个“正确”的后退条目——从 all 子片段返回到单个主片段。水平导航无论如何都没有添加到后堆栈. 本来以为内置回栈会更有效率,但是看到这个后,我不这么认为了。)
【讨论】:
以上是关于Android FragmentTabHost popBackStack() 导致 IllegalStateException Fragment 已添加的主要内容,如果未能解决你的问题,请参考以下文章
Android FragmentTabHost底部选项卡实现
Android FragmentTabHost popBackStack() 导致 IllegalStateException Fragment 已添加
Android FragmentTabHost 添加水平滚动
android.support.v4.app.FragmentTabHost 无法转换为 android.widget.LinearLayout