片段未从 BackStack 中删除
Fragment is not removed from BackStack
我使用 BackStack 来存储片段并且它工作正常。但是,当我想从 BackStack 中删除片段时,什么也没有发生。
我检查了一些问题,例如 this,发现他们确实像我一样使用 popBackStack 从 BackStack 中删除了一个项目,但这对我不起作用。
这是我的代码:
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 正确显示了最上面的片段。有趣的是,count 和 count1 是相等的,并且在使用 popBackStack 命令后,堆栈中最顶层的项目仍然存在。所以我无法从堆栈中删除最顶层的片段。
如果使用此代码:
String previousTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
Fragment previousInstance = getSupportFragmentManager().findFragmentByTag(previousTag);
fragmentTransaction.replace(R.id.container_body, previousInstance,previousTag);
fragmentTransaction.commit();
我可以用之前的片段替换片段,但这不是正确的方法,因为我无法支持多个片段。
我发现了:popBackStack 方法在调用后不会立即弹出。所以我必须使用 popBackStackImmediate 方法而不是 popBackStack。
这是我最终更正的代码:
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();
}
我使用 BackStack 来存储片段并且它工作正常。但是,当我想从 BackStack 中删除片段时,什么也没有发生。 我检查了一些问题,例如 this,发现他们确实像我一样使用 popBackStack 从 BackStack 中删除了一个项目,但这对我不起作用。
这是我的代码:
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 正确显示了最上面的片段。有趣的是,count 和 count1 是相等的,并且在使用 popBackStack 命令后,堆栈中最顶层的项目仍然存在。所以我无法从堆栈中删除最顶层的片段。
如果使用此代码:
String previousTag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
Fragment previousInstance = getSupportFragmentManager().findFragmentByTag(previousTag);
fragmentTransaction.replace(R.id.container_body, previousInstance,previousTag);
fragmentTransaction.commit();
我可以用之前的片段替换片段,但这不是正确的方法,因为我无法支持多个片段。
我发现了:popBackStack 方法在调用后不会立即弹出。所以我必须使用 popBackStackImmediate 方法而不是 popBackStack。 这是我最终更正的代码:
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();
}