2013-08-17 19 views
6

Halihazırda bir etkinliğim var ve buna parçalar ekleniyor (arama, şarkı ayrıntıları, ayarlar vb.). Yan tabanlı menü navigasyonu yaptım, şimdi, bir yan etki olarak, tehre Backstack'a kaç tane Fragment ekleneceğine dair bir sınır değil. Parça sayısını sınırlayabilmem ya da eski girişleri kaldırabilmemin bir yolu var mı? Örneğin, her şarkı ayrıntıları parçası, önerilen bir şarkı listesine sahiptir ve bu sayede başka bir şarkı ayrıntıları bölümüne gidebilirsiniz. Arka taraftaki 30 parçanın bulunması kolayca mümkündür, ki DDMS açık ise, yığın boyutunu yavaşça (ama kesinlikle) artırarak görebilirsiniz.Android - backStack içindeki parça sayısını sınırlandırın?

Düzenleme: Yapmam gereken bir şey, bir kullanıcı yan menü seçeneklerinden birini tıklatırsa, bu parça zaten arka taraftaki bir yerdeyken, yeni bir örnek oluşturmak yerine bu parçaya geri dönmeyi denerse Eğer bir kullanıcı bir Şarkı Ayrıntıları sayfasındaysa, o zaman geri tuşuna basarak onu çalışmasına izin vermeyecektir.

Düzenleme 2: Bu (Phil önerisi ile birlikte) benim addFragment yöntemidir:

public void addFragment(Fragment fragment) { 

     FragmentManager fm = getSupportFragmentManager(); 
     if(fm.getBackStackEntryCount() > 2) { 

       fm.popBackStack(); 
      } 
     fm.beginTransaction()     
        .replace(R.id.fragment_container, fragment).addToBackStack("") 
        .commit(); 
} 

Sadece denedim ve benim Fragment geçmişini varsayarak geçerli: A-> B-> C-> D, D'den geri dönerek B-> A-> çıkışına gider.

Test etmek için 8 seviye daha derinlere gittim: A-> B-> C-> D-> E-> F-> G-> H ve H'den geri dönüyorum, aynı şey oldu: H-> B -> A-> çıkış.

Yukarıdaki parçalardan tüm Fragmanlar eklenir. Görmek istediğim: H-> G-> F-> exit.

cevap

10

Sen programlı bir şekilde BackStack içinde Fragments sayısını kontrol edebilirsiniz:

FragmentManager fm = getActivity().getSupportFragmentManager(); 

if(fm.getBackStackEntryCount() > 10) { 

    fm.popBackStack(); // remove one (you can also remove more) 
} 

Basitçe Backstack içinde kaç tane fragmanlar kontrol etmek ve bir "taşma" varsa kaldırın. Eğer BackStack belirli Fragments kaldırmak isterseniz

, kendi BackStack uygulamak zorunda ve onBackPressed geçersiz kılar(). Fragman BackStack bir Yığın (adından da anlaşılacağı gibi) olduğu için, sadece en üstteki eleman (son eklenen) kaldırılabilir, Fragmentler arasında boşluk bırakma olasılığı yoktur.

Örneğin kendi yığını gerçekleştirmek için

ArrayList<Fragment> 

kullanabilirsiniz. Sadece onBackPressed() yöntemini geçersiz kılarak, önceki bölümlerin yüklenmesini ve yüklenmesini istediğinizde, "yığın"'dan (artık bir yığın değil) Fragments eklemeniz ve kaldırmanız yeterlidir.

+0

Nerede myFrag nereden geliyor? Yeni bir Fragman eklemek üzereyken bu kodu çalıştırdığımı varsayarsak, önceden tüm Fragmanlar için bir referansa sahip olmak zorunda mıyım? – StackOverflowed

+0

Eh, bu sadece bir örnek kod, myFrag örneğin şu anda aktif Fragman olabilir. Bu kod ayrıca if ifadesinin içinde fm.popBackStack() öğesini çağırmakla da çalışır. –

+0

Doğru yoldasınız gibi görünüyor, ancak OLDEST parçaları çıkarılmasını istiyorum. Açıklama için lütfen bkz. Şimdiye kadar yardımın için minnettarım. – StackOverflowed

3

Bu eski bir soru ama cevabım birine yardımcı olabilir.

Parça parça yığınında olup olmadığını neden kontrol etmiyorsunuz? Bu şekilde, arka yığın boyutu ile endişelenmenize gerek kalmaz (çok fazla parçanız yoksa).

String backStateName = fragment.getClass().getName(); 
    boolean fragmentPopped = false; 
    try { 
     // true if fragment is in the stack 
     fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    FragmentTransaction ft = fragmentManager.beginTransaction(); 

    if (!fragmentPopped) { //fragment not in back stack, add it...    
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.replace(R.id.main, fragment); 
     ft.addToBackStack(backStateName); 

     try { 
      ft.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }   
    }