2011-08-19 75 views
37

Tengo una Activity. El Activity tiene dos Fragment s. El fragmento A es Menú. El fragmento B es detalle.Cómo destruir Fragment?

Intento hacer otro Fragmento C en el Fragmento B, por lo tanto, hay 3 Fragmentos en el Activity. Y trato de reemplazar el fragmento B con el fragmento D.

Supongo que el fragmento B y C están muertos. PERO estos Fragmentos están vivos. Just Fragments are onDestroyView() state. Quiero onDestroy() o onDetach().

¿Qué hago para Fragments.onDestroy() o onDetach()? No puedo destruir o cambiar el Activity.

+0

¿Está reemplazando añadiendo a la pila de vuelta? Si es así, entonces no espero que el fragmento sea destruido. Si es así, no agregue la transacción a la pila posterior en un reemplazo. – PJL

Respuesta

54

Si no elimina estos fragmentos manualmente, todavía están adjuntos a la actividad. Tu actividad no se destruye, por lo que estos fragmentos también lo son. Para eliminar (para destruir), estos fragmentos, puede llamar a:

fragmentTransaction.remove(yourfragment).commit() 

espero que ayude a que

+0

Esto me ayudó con el temido bloqueo "Duplicate id". ¡Gracias! – xorgate

+0

cuando se elimina un fragmento, ¿qué método de ciclo de vida de fragmento se llama? De manera similar, cuando se reemplaza un fragmento, ¿qué método del fragmento se llama ciclo de vida? –

+4

Guau, esto hace que la documentación de Google para replace() sea totalmente incorrecta: '' Esto es esencialmente lo mismo que llamar remove (Fragment) para todos los fragmentos agregados actualmente que se agregaron con el mismo containerViewId y luego agregar (int, Fragment, String) con los mismos argumentos dados aquí. "Cuando en realidad, solo llamar a remove() destruye el fragmento y reemplazar no. – 0101100101

9

darle una oportunidad a este

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 

    FragmentManager manager = ((Fragment) object).getFragmentManager(); 
    FragmentTransaction trans = manager.beginTransaction(); 
    trans.remove((Fragment) object); 
    trans.commit(); 

    super.destroyItem(container, position, object); 
} 
2

Si se encuentra en el fragmento de sí mismo, necesitas llamar esto yourFragment necesita ser el fragmento al que se está llamando.Introducir código:

getFragmentManager(). beginTransaction(). remove (yourFragment) .commitAllowingStateLoss();

o si está utilizando supportLib, entonces tienes que llamar:..

getSupportFragmentManager() beginTransaction() quitar (yourFragment) .commitAllowingStateLoss();

-1

Se utiliza en Kotlin

appCompatActivity?.getSupportFragmentManager()?.popBackStack()