tabhost studio example android android-fragments android-tabhost

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í.