Remove old Fragment from fragment manager

后端 未结 5 1871
孤城傲影
孤城傲影 2020-11-27 15:26

I\'m trying to learn how to use Fragments in android. I\'m trying to remove old fragment when new fragment is calling in android.

相关标签:
5条回答
  • 2020-11-27 16:02

    Probably you instance old fragment it is keeping a reference. See this interesting article Memory leaks in Android — identify, treat and avoid

    If you use addToBackStack, this keeps a reference to instance fragment avoiding to Garbage Collector erase the instance. The instance remains in fragments list in fragment manager. You can see the list by

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

    The next code is not the best solution (because don´t remove the old fragment instance in order to avoid memory leaks) but removes the old fragment from fragmentManger fragment list

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

    You cannot remove the entry in the arrayList because apparenly FragmentManager works with index ArrayList to get fragment.

    I usually use this code for working with 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();
    }
    
    0 讨论(0)
  • 2020-11-27 16:09

    If you want to replace a fragment with another, you should have added them dynamically, first of all. Fragments that are hard coded in XML, cannot be replaced.

    // 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();
    

    Refer this post: Replacing a fragment with another fragment inside activity group

    Refer1: Replace a fragment programmatically

    0 讨论(0)
  • 2020-11-27 16:15

    You need to find reference of existing Fragment and remove that fragment using below code. You need add/commit fragment using one tag ex. "TAG_FRAGMENT".

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

    That is it.

    0 讨论(0)
  • 2020-11-27 16:15

    I had the same issue to remove old fragments. I ended up clearing the layout that contained the fragments.

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

    I do not know if this creates leaks, but it works for me.

    0 讨论(0)
  • 2020-11-27 16:17

    I had the same issue. I came up with a simple solution. Use fragment .replace instead of fragment .add. Replacing fragment doing the same thing as adding fragment and then removing it manually.

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

    instead of

    getFragmentManager().beginTransaction().add(fragment).commit();
    
    0 讨论(0)
提交回复
热议问题