【发布时间】:2016-12-20 08:01:29
【问题描述】:
我有四个片段 F1,F2,F3,F4。我正在使用替换方法来替换已添加到容器中的现有片段。他们中很少有人使用 addToBackStack(null) 添加到 backstack,很少有人使用 addToBackStack(tag) 添加。 现在通过以下方法检查片段是否已经添加或存在于事务中
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;
}
使用以下方法替换片段
public void setFragmentToContainer(Fragment fragment) {
final String tag = fragment.getClass().getName();
if (manager == null) {
manager = getSupportFragmentManager();
}
transaction = manager.beginTransaction();
if (isFragmentInBackstack(manager, tag)) {
// Fragment exists, go back to that fragment
//// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow
manager.popBackStackImmediate(tag,0);
transaction.remove(fragment);
} else {
// Fragment doesn't exist
}
transaction.replace(R.id.layout_content, fragment);
if (fragment instanceof CompanyLevelFragment) {
//Exit app on back press
} else {
if (fragment instanceof F1) {
transaction.addToBackStack(null);
} else {
transaction.addToBackStack(tag);
}
}
transaction.commit();
}
问题: 假设我第一次将片段 F2 添加到事务中,然后我更改了应用程序中的日期以获取特定日期的更新数据。获取更新数据后,我调用 setFragmentToContainer() 将检查 backstack 中的片段条目, isFragmentInBackstack() 将检查片段是否已经在 backstack 中,然后调用 popBackStackImmediate 删除条目。
我需要按两次后退按钮两次关闭片段 F2。如何从管理器中删除相同片段的早期空白条目?另一个例子假设如果我添加 F3 四次,那么我将不得不按四次返回按钮。
请告诉我如何在添加到后台堆栈之前删除相同片段的旧条目?
【问题讨论】: