简体   繁体   English

片段未从BackStack中删除

[英]Fragment is not removed from BackStack

I use BackStack to store fragments and it works fine. 我使用BackStack来存储片段,并且工作正常。 However when I want to remove a fragment from BackStack, nothing happens. 但是,当我想从BackStack中删除片段时,什么也没发生。 I checked some questions like this and saw that they do remove an item from BackStack by using popBackStack, like me, but it does not work for me. 我查了一些类似的问题 ,看到他们这样做,通过使用popBackStack,像我去掉堆栈中的项目,但它并没有为我工作。

This is my code: 这是我的代码:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    int count = getSupportFragmentManager().getBackStackEntryCount();

    String currentTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    Fragment currentInstance = getSupportFragmentManager().findFragmentByTag(currentTag);
    fragmentTransaction.remove(currentInstance);
    fragmentTransaction.commit();
    fragmentManager.popBackStack(getSupportFragmentManager().getBackStackEntryCount() - 1, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    int count1 = getSupportFragmentManager().getBackStackEntryCount();

currentInstance shows the topmost fragment correctly. currentInstance正确显示最上面的片段。 Interestingly count and count1 are equals and the topmost item in stack remains after using popBackStack command. 有趣的是count和count1相等,并且在使用popBackStack命令后,堆栈中的最高项仍然保留。 So I cant remove the topmost fragment from stack. 所以我不能从堆栈中删除最上面的片段。

If use this code: 如果使用此代码:

        String previousTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
        Fragment previousInstance = getSupportFragmentManager().findFragmentByTag(previousTag);

        fragmentTransaction.replace(R.id.container_body, previousInstance,previousTag);
        fragmentTransaction.commit();

I could replace fragment with previous one, but it's not correct way to do that, because I can't back for more than one fragment. 我可以用之前的片段替换片段,但这不是正确的方法,因为我不能返回多个片段。

I found it out: popBackStack method does not pop immediately after call. 我发现:popBackStack方法不会在调用后立即弹出。 So in I have to use popBackStackImmediate method instead of popBackStack. 因此,我必须使用popBackStackImmediate方法而不是popBackStack。 This is my final corrected code: 这是我最后的更正代码:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (getSupportFragmentManager().getBackStackEntryCount()> 0) {
   fragmentManager.popBackStackImmediate(getSupportFragmentManager().getBackStackEntryCount() - 1, FragmentManager.POP_BACK_STACK_INCLUSIVE);

   String previousTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
   Fragment previousInstance = getSupportFragmentManager().findFragmentByTag(previousTag);

  fragmentTransaction.replace(R.id.container_body, previousInstance, previousTag);
  fragmentTransaction.commit();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM