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

Android Studio不识别support.v4.app.FragmentTabHost的问题。

Fragment+FragmentTabHost组件实现常见主页面(仿微信新浪)