2013-06-14 5 views
42

yılında Fragment backstack temizlemek için nasıl selam ... işe yaramıyor mantık altındaandroid

for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++i) {    
    mFragmentManager.popBackStack(); 
} 

yardım bana ..

cevap

92

kullanmak geçmesine ama sadece ben yapabilirsiniz bu problemi kendim yaşadım. Yapabilirsiniz:

FragmentManager manager = getFragmentManager(); 
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0); 
manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Oldukça açıklayıcı; sadece ilk girişi al, kimliğini al ve sonra her şeyi bu kimlikle birlikte gir. Yukarıdaki

+1

Aynı problemim var ve bu benim için işe yaramıyor! –

+5

Lütfen bu en iyi çözümlerden biri olduğundan emin olun. Arka planı temizledikten hemen sonra yeni şeyler ekliyorsanız, popBackStackImmediate öğesini çağırmanız gerekebilir. – marsbear

+13

Bu, yalnızca üst durumu açacak, birden fazla varsa backstack'i temizlemeyecektir. – Tapirboy

14

tek yön etiketi etmektir kullanıyorum geri yığın parçasını nasıl temizleneceğini backstack ve bunu "myfancyname" Eğer addToBackStack ile kullanılan dize eşleşmesi gerekir

mFragmentManager.popBackStack("myfancyname", FragmentManager.POP_BACK_STACK_INCLUSIVE); 

temizlemek istediğinizde. Örneğin.

Fragment fancyFragment = new FancyFragment();  
fragmentTransaction.replace(R.id.content_container, fancyFragment, "myfragmentag"); 
fragmentTransaction.addToBackStack("myfancyname"); 

backstack adı ve veridiliminin etiket adı aynı olabilir ama orada hiçbir kısıtlar belgelere

kümesi ise itibaren bu konuda

üzerindedir ve adı veya kimliği bir arka yığını girdisi temin edilmiş ait, sonra tüm eşleşen girişleri eşleşme bulunduğunda yok veya yığının alt ulaşılana biri kadar tüketilen edilecektir. Aksi takdirde, bu giriş dahil olmak üzere en fazla girişi kaldırılacaktır.

Eğer backstack için bir ad kullanmak istemiyorsanız sen biraz daha geç bu

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
+0

nasıl isim backstack vermek do? –

+1

Gokhan, isim backstack adı değil, Fragment'ın etiket adı. Onun örneği için, o haşhaş ettiği parça şu şekilde eklenecekti: 'mFragmentManager.beginTransaction(). Add (mFragment," myfancyname ");' –

6

Bu deneyin birinci parametreyi

mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
67

Cevap neredeyse doğrudur, ancak boş olabilir gibi parçanın geri etrafında listesini bir bekçi gerekir:

private void clearBackStack() { 
    FragmentManager manager = getSupportFragmentManager(); 
    if (manager.getBackStackEntryCount() > 0) { 
     FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0); 
     manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    } 
} 
15
while (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
    getSupportFragmentManager().popBackStackImmediate(); 
} 
+0

Daha fazla detaylandırdıysanız, bu kabul edilen cevap olmalıdır. Tüm backstack'ı temizlemek istediğimiz şeydir – HaydenKai

+2

Ama sonuncuyu gösteriyor. Genellikle, bundan sonra backstack için yeni bir parça eklersiniz. –

+0

Buradaki bir uyarı, arka planın bir döngü içinde patlatılmasıdır, bunun gibi, ortaya çıktığı tüm parçalarda (oluşturma yöntemleri ve kapatma yöntemleri) yaşam döngüsü olaylarını arayarak, istenmeyen yan etkilere neden olabilirsiniz. –

0

gördüğüm en iyi seçenek burada.

  int count = getSupportFragmentManager().getBackStackEntryCount(); 
      if (count > 0) { 
       getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      }