2011-08-19 58 views
37

Bir tane Activity var. Activity, iki Fragment s'ye sahiptir. A Bölümü, Menü. B Parçası Detay.Fragman nasıl yok edilir?

Fragman B'de diğer Fragman C'yi yapmaya çalışıyorum, bu nedenle, Activity'da 3 Fragman var. Ve ben Fragman B'yi Parça D'ye Değiştirmeye çalışıyorum.

Sanırım B Parçası ve C öldü. ANCAK bu Fragmanlar yaşıyor. Sadece Fragmanlar onDestroyView() durumdur. onDestroy() veya onDetach()'u istiyorum.

Fragments.onDestroy() veya onDetach() için ne yapabilirim? Activity'u yok edemiyorum veya değiştiremiyorum.

+0

değiştirmekte Are içinde kullanılır? Eğer öyleyse, parçanın imha edilmesini beklemiyorum. Daha sonra, işlemi bir değiştirmenin arka yığına eklemezseniz. – PJL

cevap

54

Bu parçaları el ile kaldırmazsanız, yine de etkinliğe eklenir. Faaliyetiniz yok edilmedi, bu yüzden bu parçalar da. bu parçaları çıkarın (böylece yok etmek) için, çağırabilirsiniz:

fragmentTransaction.remove(yourfragment).commit() 

Eğer fragmanı kendisindeyseniz sen

+0

Bu, korkulu "Duplicate id" çökmesine yardımcı oldu. Teşekkürler! – xorgate

+0

Bir fragman çıkarıldığında, hangi parça yaşam döngüsü yöntemi çağrılır? Benzer şekilde, bir parça değiştirildiğinde, parça yaşam döngüsünün hangi yöntemi çağrılır? –

+4

Wow, bu, Google'ın replace() öğesiyle ilgili dokümantasyonunu tamamen yanlış yapar: '' Bu, aslında aynı containerViewId ile eklenen tüm parçaların kaldırılması (Fragment) ile aynıdır ve sonra (int, Fragment, String) ile eklenir. Burada verilen aynı argümanlar. ”Gerçekte, sadece() 'yi çağıran parçayı parçalara ayırıp değiştirmez. – 0101100101

9

bu

@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

deneyin verin için yardımcı olur Umut, Bunu araman gerek. YourFragment çağrılan parça olması gerekiyor.Enter code:

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

veya supportLib kullanıyorsanız, o zaman çağırmanız gerekir.:.

getSupportFragmentManager() beginTransaction() kaldırmak (yourFragment) .commitAllowingStateLoss();

-1

Geri yığınına ekleyerek KOTLIN

appCompatActivity?.getSupportFragmentManager()?.popBackStack()