片段在重新进入时没有被替换

时间:2014-06-11 16:11:32

标签: 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(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,未调用onPause()/ onStop()并且两者都是在另一个之上绘制的。有谁知道是什么原因引起的?

我提交了一份错误报告,因为我真的不确定为什么会出现这种情况,它位于here

1 个答案:

答案 0 :(得分:0)

所以我可以告诉我这是发生了什么,如果有人偶然发现这个问题,我希望我的回答是有用的!

重新输入标签片段,即:

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

对于最后一次转换,当用B替换时A不会分离,所以我把它放在片段A的onCreateView()

        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);
                }
            }
        });

意味着创建了每次片段A,我们分离了任何错误地可能未被分离的标签片段。