删除后碎片仍然存在吗?

Posted

技术标签:

【中文标题】删除后碎片仍然存在吗?【英文标题】:Fragment still exists after remove? 【发布时间】:2016-04-07 17:59:17 【问题描述】:

1 向 FragmentManager 添加两个片段

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft1 = fm.beginTransaction();
ft1.add(containerId, fragment1, "fragment1");
ft1.addToBackStack(null);
ft1.commitAllowingStateLoss();

FragmentTransaction ft2 = fm.beginTransaction();
ft2.add(containerId, fragment2, "fragment2");
ft2.addToBackStack(null);
ft2.commitAllowingStateLoss();

2 更改移动设置 开发者选项-> 不保留活动-> 开启

3 Activity 重新创建后删除所有片段

FragmentTransaction ft3 = fm.beginTransaction();
for(Fragment f : fm.getFragments())  ft3.remove(f); 
ft3.commitAllowingStateLoss();

我的问题是为什么 fm.findFragmentByTag("fragment1") 在删除后不为空?

minSdkVersion 17 targetSdkVersion 22 compileSdkVersion 22

【问题讨论】:

【参考方案1】:

试试这个代码来删除片段

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();

我想你还没有添加这个方法

manager.popBackStack();

getSupportFragmentManager().popBackStack()

【讨论】:

像魅力一样工作!【参考方案2】:

使用popBackStackImmediate() 而不是popBackStack() 确保片段立即从后台删除。 transection 的 remove 方法不会从 backstack 中删除 Fragment,它只是用于 transection。

【讨论】:

【参考方案3】:

试试这个...

    List<Fragment> list = getSupportFragmentManager().getFragments();
    if (list == null) 
        Log.e("TAg", "No existing fragments" );
    

    for (Fragment frag : list)
    
        // To save any of the fragments, add this check.
        // A tag can be added as a third parameter to the fragment when you commit it
        if (frag.getTag().equals("tag-name")) 
            continue;
        

        getSupportFragmentManager().beginTransaction().remove(frag).commit();
    

【讨论】:

【参考方案4】:

我遇到了同样的问题。我使用以下标签删除了片段:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
Fragment fragment = fragmentManager.findFragmentByTag("fragment1");
ft.remove(fragment);
ft.commit();

现在findFragmentByTag() 应该返回 null

【讨论】:

【参考方案5】:

而不是

ft1.add(containerId, fragment1, "fragment1");

试试

ft1.replace(containerId, fragment1, "fragment1");

并使用

fragmentmanager.popBackStack();

【讨论】:

【参考方案6】:

你应该commit单个片段删除事务。

此代码将在循环完成后提交

for(Fragment f : fm.getFragments())  ft3.remove(f); 
ft3.commitAllowingStateLoss();

而不是使用brackets

for(Fragment f : fm.getFragments())
 ft3.remove(f); 
 ft3.commitAllowingStateLoss();

【讨论】:

【参考方案7】:
          public  void popAll() 
            if (mFragmentManager != null) 
                if (!mOnPause && mFragmentManager.getBackStackEntryCount() > 0) 
                    if (isFragmentOnStack(HomeFragment.TAG_NAME))
                        mFragmentManager.popBackStackImmediate(HomeFragment.TAG_NAME, 0);
                    else
                        mFragmentManager.popBackStackImmediate(null,
                                FragmentManager.POP_BACK_STACK_INCLUSIVE);
                 else if (mFragmentManager.getBackStackEntryCount() > 0) 
                    mTransactionList.clear();
                    mTransactionList.add(new FragmentPopAll());
                


 
    

【讨论】:

【参考方案8】:

使用commitNow 方法而不是commitAllowingStateLoss,因为它同步执行事务

【讨论】:

以上是关于删除后碎片仍然存在吗?的主要内容,如果未能解决你的问题,请参考以下文章

mongo的碎片整理

mongoDB磁盘碎片整理

mongoDB磁盘碎片整理

MySQL 清除表空间碎片

MySQL 清除表空间碎片

MySQL 清除表空间碎片