Android 碎片在返回时未被替换

Android 碎片在返回时未被替换,android,fragment,android-tabs,fragmentmanager,Android,Fragment,Android Tabs,Fragmentmanager,这件事我已经被难住两天了: 1个活动,3个片段A、B和C。B和C是标签。如果我用B替换片段A,并将A添加到后堆栈中,如下所示: fragmentManager.beginTransaction() .addToBackStack("A_TO_B_TAG") .replace(R.id.fragmentContainer, fragment, "FragmentB") .setTransition(Fragm

这件事我已经被难住两天了:

1个活动,3个片段A、B和C。B和C是标签。如果我用B替换片段A,并将A添加到后堆栈中,如下所示:

fragmentManager.beginTransaction()
               .addToBackStack("A_TO_B_TAG")
               .replace(R.id.fragmentContainer, fragment, "FragmentB")
               .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
               .commit();
当我点击片段C中的向上插入符号并执行以下操作时:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Pop the back stack and hide the Up caret
                FragmentManager fm = mHostingActivity.getSupportFragmentManager();
                if (fm.getBackStackEntryCount() > 0) {
                    fm.popBackStack();
                }
                mHostingActivity.getDrawerToggle().setDrawerIndicatorEnabled(true);

                //Kill any tabs
                mHostingActivity.getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
                mHostingActivity.getSupportActionBar().removeAllTabs();


                return true;
        }
        return super.onOptionsItemSelected(item);
    }
然后使用第一个代码段重新输入B,A的onPause/onStop不会被调用,并且两者都是在彼此的顶部绘制的。有人知道这是什么原因吗


我提交了一份错误报告,因为我真的不确定为什么会发生这种行为,它是在哪里发生的。

因此,从我所知道的情况来看,这就是正在发生的事情,如果有人偶然发现这个问题,我希望我的答案是有用的

重新输入选项卡式片段,即:

添加A->用选项卡B替换A->用选项卡C替换B->弹出选项卡C->然后再次用选项卡B替换A

在最后一次转换中,用B替换A时,A不会分离,所以我将其放在片段A的onCreateView中


也就是说,每次创建片段A时,我们都会分离任何可能未被错误分离的选项卡式片段。

请尝试fm.popbackbacksitime;嗯,我几乎可以肯定问题不在于后堆栈。如果我不“tabify”B和C,它可以正常工作。请看,我需要的是后堆栈中的片段A,而不是B或C,因为它们是选项卡。当我用Frag B替换Frag A时,Frag A不会停止绘图。它在第一次加载Frag B时工作正常,但在第二次加载Frag B时不会。
        final FragmentManager fm = mHostingActivity.getSupportFragmentManager();
        fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
            @Override
            public void onBackStackChanged() {
                if (fm.getBackStackEntryCount() == 0) {
                    Fragment fragmentB = fm.findFragmentByTag("FragmentB");
                    Fragment fragmentC =  fm.findFragmentByTag("FragmentC");

                    if (fragmentB != null) {
                        //Hmm force detach here rather than when we pop via the up affordance
                        if (!fragmentB.isDetached())
                            fm.beginTransaction().detach(fragmentB).commit();
                    }
                    if (fragmentC != null) {
                        if (!fragmentC.isDetached())
                            fm.beginTransaction().detach(fragmentC).commit();
                    }

                    //Listened for any changes after re-entering the FragmentA so we can remove the listener
                    fm.removeOnBackStackChangedListener(this);
                }
            }
        });