2015-03-19 17 views
14

Mam dwie aktywności A i B. Aktywność A ma funkcję mapFragment i dodaje ją do backstack. Kiedy wracam z Actvity A z B, chcę, aby fragment ukazał się w tym samym stanie, w jakim go zostawiłem. . Ale getFragmentManager() getBackStackEntryCount() jest zwrócenie mi 0. Oto mój kod:getBackStackEntryCount() zawsze zwraca 0 nawet po dodaniu addToBackStack i executePendingTransactions()

MapFragment mMapFragment = MapFragment.newInstance(); 
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    mMapFragment.getMapAsync(this); 
    fragmentTransaction.replace(R.id.container, mMapFragment); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
    getFragmentManager().executePendingTransactions(); 

Po powrocie z działalności B, mam to wiedzieć liczbę getBackStackEntryCount():

System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount()); 

który pokazuje mi 0.

Z góry dziękuję.

Odpowiedz

1

Spróbuj tego:

MapFragment mMapFragment = MapFragment.newInstance(); 
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    mMapFragment.getMapAsync(this); 
    fragmentTransaction.add(R.id.container, mMapFragment); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 
    getFragmentManager().executePendingTransactions(); 

Zmieniłem tę linię:

fragmentTransaction.replac(R.id.container, mMapFragment); 

do tego:

fragmentTransaction.add(R.id.container, mMapFragment); 

całkiem pewny, że jeśli zastąpić fragment następnie jej nie w backstack :)

+0

Dzięki, ale wciąż wyświetlaj 0. – user3555350

+0

Poza przełączaniem 'replace()' przeciwko 'add()' musisz również dodać '.addToBackStack (null)' –

40

Miałem podobny problem, w moim przypadku getFragmentManager().getBackStackEntryCount() zawsze zwracało zero.

Mój problem był ja stosując fragmenty wsparcia:

Fragment fragment = new MyFragment(); 
// note getSupportFragmentManager() instead getFragmentManager() 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction() 
.replace(R.id.frame, fragment) 
.addToBackStack(null) 
.commit(); 

fragmentManager.executePendingTransactions(); 

a ja sprawdzając getFragmentManager()backStackEntryCount, który zawsze zwraca zero (nie jest to za pomocą innego menedżera fragment):

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack();    
    } 
} 

zamiast getSupportFragmentManager, który zwraca prawidłową liczbę:

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack();   
    } 
} 
+0

s, to naprawdę działało, kiedy zmieniłem getFragmentManager() na getSupportFragmentManager(). Dzięki za odpowiedź .. –

+0

, ale dlaczego? używam wspólnych Fragmentów z popularnym Menedżerem Fragmentów, skąd mogę wiedzieć, jakiego FM - wspólnego lub wsparcia używać w przypadku? – Anton

+0

to zależy, czy importujesz android.support.v4.app.FragmentManager lub android.app.FragmentManager – Neonigma

0

Mam inne rozwiązanie (obejść), aby wykryć fragmenty, ponieważ w moim przykładzie FM.getBackStackEntryCount() również zwrócił 0 i FM.executPendingTransactions nie działa.

Więc tutaj jest jak dodać nowy fragment:

getFragmentManager().beginTransaction() 
         .add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG) 
         .setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out) 
         .commit(); 

A oto jak usunę go:

Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG); 
     if(prevTool != null){ 
      getFragmentManager().beginTransaction().remove(prevTool).commit(); 
     }else { 
      intentCANCELED(); 
     } 

Orginally założył here.

2

Mam podobny problem. Dzięki this answer tworzę poniżej kodu w mojej działalności, zamiast fragmentu, a ta praca rozwiązanie dobrze:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Log.d("ovech", "back stack changed"); 
      Log.d("ovech", "back stack count = " + getSupportFragmentManager().getBackStackEntryCount()); 
      if(getSupportFragmentManager().getBackStackEntryCount()>0) { 
       toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); 
      } else { 
       toolbar.setNavigationIcon(null); 
       Log.d("ovech", "hello without icon"); 
      } 
      toolbar.invalidate(); 
     } 
    }); 
0

Wystarczy zastąpić getFragmentManager() z getSupportFragmentManager(). Proste rozwiązanie. To działa dla mnie. Musisz to zrobić na swojej aktywności

+0

Nie oferujesz niczego, co nie jest napisane w innych odpowiedziach –