【问题标题】:Fragment not getting replaced on re-entry重新进入时没有更换碎片
【发布时间】:2014-06-11 16:11:32
【问题描述】:

这两天我已经被这个问题难住了:

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

然后用第一个代码 sn-p 重新输入 B,A 的 onPause() / onStop() 没有被调用,两者都在一个另一个的顶部绘制。有谁知道是什么原因造成的?

我已经提交了一份错误报告,因为我真的不确定为什么会发生这种行为,它位于 here

【问题讨论】:

  • 试试 fm.popBackStackImmediate();
  • 嗯,我几乎可以肯定问题不在于后堆栈。如果我不'tabify' B 和 C,它可以正常工作。请参阅我需要在后堆栈中的 Fragment A(不是 B 或 C,因为它们是选项卡)。当我用 Frag B 替换 Frag A 时,它不会停止绘制。它第一次工作正常,但第二次加载 Frag B 时就不行了。

标签: android fragment android-tabs fragmentmanager


【解决方案1】:

所以据我所知,这是正在发生的事情,如果有人偶然发现这个问题,我希望我的回答很有用!

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

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

在最后一次转换中用 B 替换 A 时不会分离,所以我将它放在 Fragment 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 时,我们都会分离任何错误地可能尚未分离的选项卡式片段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 2015-12-21
    • 2019-03-12
    • 2013-12-22
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多