从片段管理器中删除旧片段

时间:2014-03-18 09:04:19

标签: android android-fragments android-tabhost

我正在尝试学习如何在android中使用Fragment s。 当新的fragment在Android中调用时,我试图删除旧的fragment

5 个答案:

答案 0 :(得分:136)

您需要找到现有Fragment的参考,并使用下面的代码删除该片段。您需要使用一个标签ex添加/提交片段。 " TAG_FRAGMENT"

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();

就是这样。

答案 1 :(得分:14)

如果要将片段替换为另一片段,首先应该动态添加片段。用XML硬编码的片段无法替换。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

请参阅此帖:Replacing a fragment with another fragment inside activity group

参考1:Replace a fragment programmatically

答案 2 :(得分:8)

我有同样的问题要删除旧片段。我最终清除了包含片段的布局。

LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...

我不知道这是否会造成泄漏,但它对我有用。

答案 3 :(得分:1)

可能你是实例旧片段,它保留了一个参考。请参阅这篇有趣的文章Memory leaks in Android — identify, treat and avoid

如果使用addToBackStack,则会保留对实例片段的引用,以避免垃圾收集器擦除实例。该实例保留在片段管理器的片段列表中。您可以通过

查看列表

ArrayList<Fragment> fragmentList = fragmentManager.getFragments();

下一个代码不是最好的解决方案(因为不要删除旧的片段实例以避免内存泄漏)但是从fragmentManger片段列表中删除旧片段

int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);

你不能删除arrayList中的条目,因为看起来FragmentManager使用索引ArrayList来获取片段。

我通常使用此代码来处理fragmentManager

public void replaceFragment(Fragment fragment, Bundle bundle) {

    if (bundle != null)
        fragment.setArguments(bundle);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment oldFragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());

    //if oldFragment already exits in fragmentManager use it
    if (oldFragment != null) {
        fragment = oldFragment;
    }

    fragmentTransaction.replace(R.id.frame_content_main, fragment, fragment.getClass().getName());

    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

    fragmentTransaction.commit();
}

答案 4 :(得分:1)

我有同样的问题。我想出了一个简单的解决方案。使用片段.replace而不是片段.add。替换片段的操作与添加片段的操作相同,然后手动将其删除。

getFragmentManager().beginTransaction().replace(fragment).commit();

代替

getFragmentManager().beginTransaction().add(fragment).commit();