2012-12-04 22 views
15

Back Stack Android'de iç içe geçmiş Fragmanlar ile etkileşimi destekliyor mu?İç içe Fragmanlar ve Arka Yığın

Böyle yaparsa, ne yapıyorum? Uygulamamda, geri düğmesi, bu işlemi arka yığına eklediğim gerçeğini tamamen yok sayar. Bunun iç içe geçmiş parçalarla ilgili bir sorundan ve sadece yanlış bir şey yapmamasından dolayı umuyorum. Ben hiç yuva parçalarını istiyorum,

 MyFragment fragment = new MyFragment(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right); 
    ft.addToBackStack(null); 
    ft.replace(R.id.myFragmentHolder, fragment); 
    ft.commit(); 
+0

herkes alabilir Daha iyi açıklayan http://stackoverflow.com/questions/13418436/android-4-2-back-stack-behaviour-with-nested-fragments başka bir bakış. – lcn

cevap

28

Ben aynı sorun var:

aşağıdaki kod benim parçaları birinin içindedir ve iç içe olursa olsun parçası Şu anda gösterilenden ile yeni fragman takas için kullanılır ve iç içe geçmiş her parça için bir arka yığını tutmak.

Fakat ... bu durum v4 destek kitaplığı tarafından ele alınmıyor gibi görünüyor.

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

mFragments faaliyet FragmentManager temsil eder ancak bu yönetici çocukların yöneticilerine pop "yayar" görünmüyor: kütüphanede FragmentActivity kodunda, ben bulabilirsiniz.

private Fragment myFragmentContainer; 

    @Override 
    public void onBackPressed() { 
      if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) { 
       finish(); //or call the popBackStack on the container if necessary 
      } 
    } 

Daha iyi bir yol olabilir ve bir daha otomatik bir yol olabilir, ama benim ihtiyaçları için: bir geçici çözüm elle aktivitede böyle, çocuk yöneticisinde() popBackStackImmediate çağırmak olacaktır FragmentActivity miras tamamdır.

Benim geçerli projede
+0

Hmm Bunu bir çekim daha vereceğim ve işe yarayıp yaramadığını kabul ediyorum. – MikeS

+0

Bu çalışmıyor gibi gözüküyor. Öncelikle, Fragments'ın bir popBackStackImmediate() yöntemi yoktur (yalnızca FragmentManager'lar). Ben this.getFragmentManager(). PopBackStackImmediate() 'yi kullanmayı denedim, ancak temelde zaten olandan farklı bir şey görmedim. – MikeS

+1

Bana verdiğin şeyle çalıştıktan sonra, çözümü buldum! Cevabınızı çözümünüzü içerecek şekilde düzenleyeceğim ve beni en doğru şekilde doğru cevabı koyduğunuz şekilde kabul ettiğim gibi işaretleyeceğim. – MikeS

-2
@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    if (fm.getBackStackEntryCount() > 0) { 
     fm.popBackStack(); 
     return; 
    } 
    finish(); 
} 
+0

Lütfen cevabınıza biraz keşif ekleyin. – DontVoteMeDown

4

Elimizdeki otomatik olarak yalnızca üst düzey parçası yöneticileri için backstack pop geçici çözümü aşağıdaki ile geldim birden çok "iç içe katmanlar": Bu OP görerek

@Override 
public void onBackPressed() { 
    SparseArray<FragmentManager> managers = new SparseArray<>(); 
    traverseManagers(getSupportFragmentManager(), managers, 0); 
    if (managers.size() > 0) { 
     managers.valueAt(managers.size() - 1).popBackStackImmediate(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

private void traverseManagers(FragmentManager manager, SparseArray<FragmentManager> managers, int intent) { 
    if (manager.getBackStackEntryCount() > 0) { 
     managers.put(intent, manager); 
    } 
    if (manager.getFragments() == null) { 
     return; 
    } 
    for (Fragment fragment : manager.getFragments()) { 
     if (fragment != null) traverseManagers(fragment.getChildFragmentManager(), managers, intent + 1); 
    } 
}