我有四个片段F1,F2,F3,F4。我正在使用replace方法来替换添加到容器中的现有片段。很少有人使用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添加四次,那么我将不得不按下后退按钮四次。
请告诉我如何在添加到Backstack之前删除相同片段的旧条目?
答案 0 :(得分:1)
在玩popBackStackImmediate
之后,我能够解决我的问题。我已将POP_BACK_STACK_INCLUSIVE
添加到popBackStackImmediate
。
if (isFragmentInBackstack(manager, tag)) {
manager.popBackStackImmediate(tag,FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
// Fragment doesn't exist
// STEP 1 + additional backstack management
}
答案 1 :(得分:0)
使用此
Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
if(fragment!=null){
getSupportFragmentManager().beginTransaction().remove(fragment);
}
答案 2 :(得分:0)
添加新片段时,只需为该片段添加 TAG 即可。 使用 TAG ,您可以轻松删除旧片段。 例如
FragmentManager fm = getSupportFragmentManager();
fm.replace(R.id.container,new MyFragment(),"TAG_FRAGMENT1").commit();
要删除代码下面的旧片段,
Fragment oldFragment = fm.findFragmentByTag("TAG_FRAGMENT1");
if(oldFragment!=null){
fm.beginTransaction().remove(oldFragment).commit();
}
删除旧片段后,您可以添加新片段。
答案 3 :(得分:0)
使用replace()
时是否添加标签?transaction.replace(R.id.layout_content, fragment);
它应该是这样的: -
transaction.replace(R.id.layout_content, fragment, "CLASS_NAME");
这里的classname将是你要打开的片段类的标签,传递名称,它可以是任何东西,但在你的情况下是classname,因为在删除时你将标签设置为类名,
final String tag = fragment.getClass().getName();
所以删除它应该是这样的
ClassGridFragment gridFragment = (ClassGridFragment) getFragmentManager().findFragmentByTag("CLASS_NAME");
if (gridFragment != null && gridFragment.isVisible()) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(gridFragment);
ft.commit();
}
}
答案 4 :(得分:0)
您好试试这个它会帮助您首先检查片段非空。
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();