2011-08-19 16 views
37

Mam jeden Activity. Model Activity ma dwie wersje: Fragment. Fragment A to Menu. Fragment B jest Szczegółem.Jak niszczyć fragment?

Próbuję zrobić inny Fragment C w Fragmentie B, więc istnieje 3 Fragment w Activity. Próbuję zastąpić fragment B fragmentem D.

Zgaduję, że fragmenty B i C są martwe. ALE te Fragmenty są żywe. Tylko fragmenty są w stanie onDestroyView(). Chcę onDestroy() lub onDetach().

Co mam zrobić dla Fragments.onDestroy() lub onDetach()? Nie mogę zniszczyć ani zmienić Activity.

+0

Czy zastąpienie przez dodanie do tyłu stos? Jeśli tak, to nie oczekuję, że ten fragment zostanie zniszczony. Jeśli następnie nie dodajesz transakcji do tylnego stosu przy wymianie. – PJL

Odpowiedz

54

Jeśli nie usuniesz ręcznie tych fragmentów, nadal będą one dołączone do działania. Twoja aktywność nie zostanie zniszczona, więc te fragmenty też są. Aby usunąć (tak zniszczyć) te fragmenty, można zadzwonić:

fragmentTransaction.remove(yourfragment).commit() 

Nadzieja pomaga Ci

+0

Pomogło mi to w przerażającym wypadku "Duplicate id". Dzięki! – xorgate

+0

po usunięciu fragmentu, która metoda cyklu fragmentu zostaje wywołana? Podobnie, gdy fragment zostanie zastąpiony, która metoda cyklu fragmentu zostanie wywołana? –

+4

Wow, to czyni dokumentację Google dla replace() całkowicie błędną: '' Jest to w zasadzie to samo, co wywołanie remove (Fragment) dla wszystkich aktualnie dodanych fragmentów, które zostały dodane z tym samym containerViewId, a następnie dodane (int, Fragment, String) z te same argumenty tutaj podane. "Gdy w rzeczywistości tylko wywołanie remove() niszczy fragment i zastępuje, nie. – 0101100101

9

Daj spróbować tego

@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

Jeśli jesteś w samym fragmencie, musisz to nazwać. yourFragment musi być fragmentem, który jest wywoływany. Kod wewnętrzny:

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

lub jeśli używasz supportLib, to trzeba zadzwonić:..

getSupportFragmentManager() beginTransaction() usunąć (yourFragment) .commitAllowingStateLoss();

-1

Jest używany w Kotlin

appCompatActivity?.getSupportFragmentManager()?.popBackStack() 
Powiązane problemy