【问题标题】:How to redirect from last fragment to specific fragment on last fragment backpress如何在最后一个片段回压上从最后一个片段重定向到特定片段
【发布时间】:2018-07-20 18:54:16
【问题描述】:

我在从 Backstack 中删除特定的 Fragment 时遇到问题。

比如,我有五个Fragments A -> B -> C -> D -> E 和所有Fragments 都来自同一个Activity with add to Backstack 并添加不使用替换。

Calling order; A -> B -> C -> D -> E.

Fragment-E (last fragment) 是我当前的Fragment 并按下Back Button 然后我想去Fragment-B。这意味着我不需要Fragment-C, Fragment-D and Fragment-E

此外,当Fragment B 在那里并按下back button 时,将调用Fragment A。这也将同时发生在所有fragment 上。

还有一件事 All Fragment 调用 APIserver 获取数据并填充到列表。

帮助实现这个场景。

【问题讨论】:

    标签: android android-fragments android-activity onbackpressed


    【解决方案1】:

    对于Fragments,您有一个名为instanceof 的方法。所以当你在Fragment E 时,试着检查一下

    同时添加做fragmentTransaction.addToBackStack("fragmentC");

    if(currentFragment instanceOf FragmentE) {
        fragmentManager.popBackStack ("fragmentC", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
    

    【讨论】:

    • @Avinsh Ravilla,如何弹出,因为我尝试删除但卡在同一个片段 E.
    • @Janak 我用popBackStack 代码编辑了我的帖子。你可以对你想要弹出的所有片段执行此操作
    【解决方案2】:

    您需要在您的Activity 中添加override onBackPressed(),从那里添加Fragment。 您可以创建自己的逻辑。比如检查current fragment是不是instanceof FragmentE你需要调用getFragmentManager().popBackStack();三次才能删除Fragments C -> D -> E

    @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
    
            if(getFragmentManager().findFragmentById(R.id.ad_container) instanceof FragmentE) {
                getFragmentManager().popBackStack();
                getFragmentManager().popBackStack();
                getFragmentManager().popBackStack();
                // pop fragment D,C from backstack
                // navigate to fragment B
            }
    
        } else {
            super.onBackPressed();
        }
    }
    

    希望这会有所帮助

    【讨论】:

    • onBackPressed 我已经使用片段的实例(对于其他片段)做了很多其他操作。所以为此,我必须检查一个特定的片段是否正确??
    • 是的,你必须检查特定的片段并相应地管理它
    【解决方案3】:

    在您的活动中覆盖 onBackPressed() 方法并添加以下代码

    @Override
        public void onBackPressed() {
            Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                if (fragment instanceof FragmentE) {
                         getSupportFragmentManager().popBackStack ("fragmentC", FragmentManager.POP_BACK_STACK_INCLUSIVE);
                } 
            } else {
                super.onBackPressed();
            }
        }
    

    记住在添加每个片段时不要忘记在transaction.commit();之前添加.addToBackStack("whichFragment")

    getSupportFragmentManager().popBackStack ("fragmentC", FragmentManager.POP_BACK_STACK_INCLUSIVE) //this essentially means also remove FragmentC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多