2014-05-19 5 views
14

kullanırken bile geri düğmesi kapatma uygulaması Stackoverflow hakkında okudum diğer soruların hiçbiri benim sorunumla yardımcı olabilir. Anlayabildiğim kadarıyla, her şeyi doğru yapıyorum.FragmentTransaction.addToBackStack()

Parçalarla bir ana/ayrıntı akışım var.

Fragment frag; 
    frag = new MainListFragment();//<-- **the master fragment** 

    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction transaction = fm.beginTransaction(); 
    transaction.replace(R.id.fragment_container, frag); 
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount()); 
    transaction.commit(); 

ana fragmanı ListView sahiptir: ana faaliyet oluşturulması üzerine

, ana fragmanı aşağıdaki kod ile yüklenir Ben detay parçasına ana parçasından gittiğinde 0'dan 1'in için, LogCat göre, Şimdi

@Override 
public void onListItemClick(ListView listView, View view, int position, long id) { 
    super.onListItemClick(listView, view, position, id); 


    FragmentManager fm = getFragmentManager(); 
    FragmentTransaction transaction = fm.beginTransaction(); 
    SubListFragment frag = new SubListFragment();//<-- **the detail fragment** 

    transaction.replace(R.id.fragment_container, frag); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    fm.executePendingTransactions(); 
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount()); 

} 

BackStackEntryCountdeğişiklikleri: Bir liste öğesi tıklayarak ayrıntılar şöyle fragmanı getirir enter image description here

Öyleyse neden detay parçasındayken arka tuşa tıkladığımda, uygulamanın ana parçacığa geri dönmek yerine kapanması neden oluyor ??????????

cevap

54

popBackStack() numaralı çağrıyı, aktivitenin onBackPressed() yöntemine eklemeniz gerekir.

Ör:

Bobbake4 cevabı müthiş, ama küçük bir sorun var @
@Override 
public void onBackPressed() { 
    if (fragmentManager.getBackStackEntryCount() > 0) { 
     fragmentManager.popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
+0

vay sayesinde. “OnBackPressed()” işlevinin otomatik olarak bu işlevi sağladığı ve özel eylemler istendiğinde yalnızca geçersiz kılınması gerektiğine dair bir kanaat altında çalışıyorum. – scottyseus

+1

@ScottScooterWeidenkopf: Bir Parçayı Açmak özel bir eylemdir. BACK düğmesi, 'Fragments' öğesinin hemen öncesindeydi ve çekirdek Android kodundaki varsayılan davranışı değiştirmek, geriye dönük uyumluluk nedenleriyle ilgili iyi bir fikir olmazdı. Bu yüzden işleri kendiniz halletmeniz için gerek. – Squonk

+1

Tamam, bu mantıklı. Ben bir yenim bu yüzden kolayca bu detayları göz ardı. Yardım için teşekkürler. – scottyseus

0

. Üç parça A, B ve C olduğumu varsayalım. A, ana Fragman (uygulamamı başlattığımda görünen parçacığı), B ve C, navigasyon çekmecesinden veya A. 'dan itibaren gidebildiğim fragmanlar. Geri düğmesini B veya C'den kullandığımda, bir önceki parçaya (A) dönüyorum, ama önceki parçanın (parça B veya C) başlığı şimdi Fragman A'nın actionBar başlığında gösteriliyor. geri navigasyonu tamamlamak için "gerçekten" geri düğmesine basın (görünümü ve parçanın başlığını görüntülemek ve doğrulamak için)

Bu sorunu çözdüğüm budur. Bu değişkenleri bildirin. gezinme çekmecesi yöntemlerini ele ediyorum benim app MainActivity olarak

public static boolean IS_FRAG_A_SHOWN = false; 
public static boolean IS_FRAG_B_SHOWN = false; 
public static boolean IS_FRAG_C_SHOWN = false; 

, benim parçaların değişimini nasıl bir yöntem displayView(position) var.

private void displayView(int position) { 
    IS_FRAG_A_SHOWN = false; 
    IS_FRAG_B_SHOWN = false; 
    IS_FRAG_C_SHOWN = false; 
    // update the main content by replacing fragments 
    Fragment fragment = null; 
    switch (position) { 
     case 0: 
      fragment = new FragmentA(); 
      IS_FRAG_A_SHOWN = true; 
      break; 
     case 1: 
      fragment = new FragmentB(); 
      IS_FRAG_B_SHOWN = true; 
      break; 
     case 2: 
      fragment = new FragmentC(); 
      IS_FRAG_C_SHOWN = true; 
      break; 

     default: 
      break; 
    } 

nihayet benim onBackPressed yönteminde, bunu:

public void onBackPressed() { 
    if(fragmentManager.getBackStackEntryCount() != 0) { 
     fragmentManager.popBackStack(); 
     if (IS_FRAG_A_SHOWN) { //If we are in fragment A when we press the back button, finish is called to exit 
      finish(); 
     } else { 
      displayView(0); //else, switch to fragment A 
     } 

    } else { 
     super.onBackPressed(); 
    } 
}