【问题标题】:POP_BACK_STACK_INCLUSIVE cause to call onResume method of previous fragmentPOP_BACK_STACK_INCLUSIVE 导致调用前一个片段的 onResume 方法
【发布时间】:2016-12-22 10:05:22
【问题描述】:

我有片段,比如 CompanyFragment、DashboardFragment、CalendarFragment。 我的默认片段是 CompanyFragment。

预期流量应该是

  • 从 CompanyFragment 中选择公司
  • 导航到 DashboardFragment
  • 从仪表板更改日期以便导航到 CalenderFragment
  • 从 CalenderFragment 中选择日期后应该回到 DashboardFragment

现在我在片段管理器上添加了三个片段 CompanyFragment -> DashboardFragment -> CalenderFragment

我正在使用以下代码 sn-p 添加/替换片段

public void setFragmentToContainer(Fragment fragment) {

        final String tag = fragment.getClass().getName();
        if (manager == null) {
            manager = getSupportFragmentManager();
        }
        transaction = manager.beginTransaction();
        if (isFragmentInBackstack(manager, tag)) {
            if (fragment instanceof DayPartStoreListingFragment) {
            } else {
                manager.popBackStackImmediate(tag, manager.POP_BACK_STACK_INCLUSIVE);
            }
        } else {
            // Fragment doesn't exist
        }
        if (fragment instanceof CalenderFragment) {
            transaction.setCustomAnimations(R.anim.slide_up, 0, 0, R.anim.slide_down);
        }
        if (fragment instanceof DayPartStoreListingFragment) {
            transaction.add(R.id.layout_content, fragment, tag);
        } else {
            transaction.replace(R.id.layout_content, fragment, tag);
        }
        if (fragment instanceof CompanyLevelFragment) {
            //Exit app on back press
        } else {
            transaction.addToBackStack(tag);
        }
        transaction.commit();
    }

要检查片段管理器中的片段条目,我使用以下代码

public static boolean isFragmentInBackstack(final FragmentManager fragmentManager, final String fragmentTagName) {
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) {
        if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) {
            return true;
        }

    }
    return false;
}

问题是: 当我尝试从 CalendarFragment 打开 DashboardFragment 时,第一次调用 CompanyFragment 的 onResume,然后调用 DashboardFragment onResume。 注意:我没有从CalenderFragment调用CompanyFragment,CompanyFragments onResume在DashboardFragmet的onResume之前自动被调用。同样的情况也发生在另一个片段上。日期更改后,首先调用前一个片段的 onResume,然后调用请求的片段的 onResume。

调试后我发现问题在 ma​​nager.popBackStackImmediate(tag, manager.POP_BACK_STACK_INCLUSIVE);

如果我从代码中删除此行,则上述场景不会被复制。但我需要这一行来清除 backstack 中相同片段的旧条目。我真的需要帮助。

【问题讨论】:

  • 您使用的是哪个版本的支持库?
  • 嗨 Posumyambu 我能够解决这个问题..将为此发布相应的答案
  • 你能发布你的答案吗?请。
  • 请检查,已发布答案

标签: android android-fragments fragment-backstack


【解决方案1】:

以下是帮助解决此问题的代码 sn-p

    private void setFragmentToContainer(Fragment fragment) {
        try {
            String fragmentTag = fragment.getClass().getName();

            manager = getSupportFragmentManager();
            boolean fragmentPopped = manager.popBackStackImmediate(fragmentTag, 0);

            if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) { //fragment not in back stack, create it.
                FragmentTransaction ft = manager.beginTransaction();
                ft.replace(R.id.layout_content, fragment, fragmentTag);

                ft.addToBackStack(fragmentTag);
                ft.commit();
            }
        } catch (IllegalStateException e) {
            e.printStackTrace();
      }
}

【讨论】:

    【解决方案2】:

    第 1 步:使用 Add 方法进行 Fragment 事务未使用 replace

     FragSignUp FragSignUp = new FragSignUp();
            FragmentTransaction ft = root.getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_in_right, R.anim.slide_out_right);
            ft.addToBackStack(FragSignUp.class.getName());
            ft.add(R.id.containerLogin, FragSignUp, FragSignUp.class.getName());
            ft.commit();
    

    第二步:在Fragment的主Activity上写onBAckPressed

     FragSignIn fragSignIn=(FragSignIn) getSupportFragmentManager().findFragmentByTag(FragSignIn.class.getName());
        if(fragSignIn!=null && fragSignIn.isVisible()){
            fragSignIn.onResume();
        }else {
            super.onBackPressed();
        }
    

    也许这段代码会起作用,试试吧……

    【讨论】:

    • 嘿,罗比,没有帮助
    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多