example - tabhost android studio
Quitar Fragmento viejo del administrador de fragmentos (4)
Necesita encontrar una referencia del Fragmento existente y eliminar ese fragmento usando el código a continuación. Necesita agregar / confirmar fragmento usando una etiqueta ex. "TAG_FRAGMENT".
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
Eso es.
Estoy tratando de aprender a usar Fragment
en Android. Estoy tratando de eliminar un fragment
antiguo cuando un nuevo fragment
llama a Android.
Probablemente el fragmento antiguo de la instancia guarda una referencia. Mira este interesante artículo Fugas de memoria en Android: identifica, trata y evita
Si usa addToBackStack, esto mantiene una referencia al fragmento de instancia evitando que Garbage Collector borre la instancia. La instancia permanece en la lista de fragmentos en el administrador de fragmentos. Puedes ver la lista por
ArrayList<Fragment> fragmentList = fragmentManager.getFragments();
El siguiente código no es la mejor solución (porque no elimina la instancia del fragmento anterior para evitar fugas de memoria), pero elimina el fragmento anterior de la lista de fragmentos fragmentManger
int index = fragmentManager.getFragments().indexOf(oldFragment);
fragmentManager.getFragments().set(index, null);
No se puede eliminar la entrada en el arrayList porque aparentemente FragmentManager funciona con el índice ArrayList para obtener el fragmento.
Usualmente uso este código para trabajar con 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();
}
Si desea reemplazar un fragmento por otro, debe haberlos agregado dinámicamente, en primer lugar. Los fragmentos que están codificados en XML no pueden ser reemplazados.
// 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();
Consulte esta publicación: Reemplazar un fragmento con otro fragmento dentro del grupo de actividades
Referencia1: Reemplazar un fragmento mediante programación
Tuve el mismo problema para eliminar fragmentos antiguos. Terminé borrando el diseño que contenía los fragmentos.
LinearLayout layout = (LinearLayout) a.findViewById(R.id.layoutDeviceList);
layout.removeAllViewsInLayout();
FragmentTransaction ft = getFragmentManager().beginTransaction();
...
No sé si esto crea filtraciones, pero funciona para mí.