2012-04-03 9 views
8

Mam aktywność z podwójnym okienkiem: lista elementów menu po lewej stronie (fragment M) i szczegóły aktualnie wybranego elementu po prawej stronie (fragment D).Android onConfigurationChanged: jak zapisywać i przywracać stos fragmentów?

Gdy użytkownik wybierze element fragmentu D, D fragment zostanie zastąpiony innym fragmencie (nazwijmy go D1). Gdy użytkownik wybierze element w fragmencie D1, fragment D1 zostanie zastąpiony innym fragmentem (nazwijmy go D2) i tak dalej. Oczywiście, gdy użytkownik naciśnie przycisk powrotu, może wrócić do historii fragmentów: D2-> D1-> D.

Mój problem: w jaki sposób mogę zapisać i przywrócić pełną fragment pleców stos momencie zmiany konfiguracji (w szczególności na orientację ekranu)?

Wydaje się bardzo dziwne mi się, że nikt inny nie miał tego problemu wcześniej, ale nie mogę znaleźć nic na ten temat w trakcie moich poszukiwań w Google i przepełnienie stosu. Jeśli przegapiłem jakiś odpowiedni wpis, proszę do mnie go skierować.

Wiem, że mogę po prostu dodać atrybut android:configChanges="orientation|screenSize" do mojej aktywności, aby uniknąć rekreacji, ale po prostu nie mogę tego zrobić.

Powodem, dla którego nie mogę tego zrobić, jest to, że używam Action Bar Sherlock (wersja 4) w celu zapewnienia kompatybilności wstecznej, a składnik ten wymaga aktywności rekreacyjnej, aby zachowywać się poprawnie po zmianie konfiguracji, AFAIK.

Jeśli istnieje inna droga do odtworzenia składnika Action Bar Sherlock bez zniszczenia i ponownego tworzenia aktywność proszę dać mi znać.

Z góry dziękuję.

Odpowiedz

0

Pasek akcji Sherlock (ABS) potrzebny do odtworzenia paska akcji w ramach odtwarzania aktywności w systemie ABS 3.x, ale zgodnie z @Jake Wharton's comment, wersja 4 nie wymaga odtwarzania - może obsłużyć zmiany orientacji. Ustaw android: configChanges = "orientation", a Twój stos powrotny fragmentów będzie się utrzymywał.

+1

@ Iarham1 dzięki za odpowiedź, ale niestety, ABS 4 nadal ma pewne problemy w niektórych wersjach systemu operacyjnego (np 2.3.7), gdy android: configChanges = „orientacja” jest ustawiony, jak opisano w [emisyjnej # 279] (https://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511), więc nie jest to obecnie możliwe rozwiązanie. Mam nadzieję, że Jake Wharton naprawi go w najbliższej przyszłości, ale czy w międzyczasie ty lub ktoś inny wie, jak zapisać i przywrócić pełny stos powrotny fragmentu po zmianie konfiguracji? Lub alternatywnie jak poprawić kod ABS, aby programowo odtworzyć tylko ABS przy zmianie konfiguracji? – Luke

5

Udało mi się to zrobić, buforując Fragmenty, ponieważ dodałem je do mojej własnej tablicy ArrayList. Następnie skonfigurowałem OnBackStackChangedListener, aby śledzić, który z nich został wyświetlony, iw razie potrzeby wyskakuję z tablicy ArrayList.

Mój cel był trochę inny, ale poniższy kod powinien być tym, czego potrzebujesz do tego, co opisujesz. Tagi są tak, że możesz mieć wiele stosów wstecz, jeśli potrzebujesz. Nie skompiluje się tak, jak jest (przytknąłem dużo mojego własnego kodu), ale powinien dać ci wyobrażenie, jak to zrobiłem. Dodatkowe zastrzeżenie: I po prostu udało się to i mogą występować problemy, na które jeszcze nie trafiłem.

public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag) 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.detach(visibleFragment); 
     ft.add(R.id.realtabcontent, fragment, tag); 
     ft.attach(fragment); 
     ft.addToBackStack(null); 
     manualBackStacks.get(tag).add(fragment); 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 

Kod zechcesz gdzie aktywność zostanie odtworzony po zmianie orientacji:

ArrayList<Fragment> backStack = 
     new ArrayList<Fragment>(manualBackStacks.get(tag)); 
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote 
for (int bs = 1; bs < backStack.size(); bs++) { 
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag); 
} 

słuchacza backstack:

public void onBackStackChanged() { 
    int index = getSupportFragmentManager().getBackStackEntryCount(); 
    ArrayList<Fragment> backStack = manualBackStacks.get(tag); 
    visibleFragment = backStack.get(index); 
    // Pop the last element if we've backed up. 
    popArrayListToIndex(backStack, index); 
} 

nadzieję, że to pomaga.

+0

Jestem bardzo zainteresowany tym podejściem, ale nie uważam, że twoja odpowiedź daje wystarczająco dużo szczegółów, aby łatwo to zrozumieć. czy możesz dodać więcej szczegółów do swojej odpowiedzi? – deepwinter

+0

Wyobraźcie to sobie, dzięki! – deepwinter

Powiązane problemy