2011-09-19 4 views
32

Występuje problem, w którym mam działanie z wieloma fragmentami. Dla każdego pojedynczego fragmentu możesz wykonać operację wyszukiwania, która działa dobrze ... jeśli wyszukujesz z dowolnego fragmentu, wyświetli nową aktywność, aby obsłużyć wyszukiwanie, a następnie zwróci wynik do działania, aby obsłużyć wyświetlanie nowy fragment. Problem jest po operacji wyszukiwania, chcę być w stanie wyczyścić (prawie) wszystkie fragmenty od korzystania popBackStackImmediate(...) i od saveInstanceState(...) nazwano, otrzymuję wyjątek, który mówi:popBackStack() po saveInstanceState()

"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState" 

Każdy pomysł jak pop z tylnego stosu po wywołaniu onSaveInstanceState?

Odpowiedz

1

Co powiesz na pojawienie się stosu bezpośrednio przed rozpoczęciem powiązanego działania? Funkcja onSaveInstanceState nie zostanie wywołana, dopóki nie zostanie wywołana funkcja startActivity (a nowa aktywność pojawi się przed bieżącą jednostką1 ... bezpośrednio przed tą sytuacją, przesuń stos fragmentów z powrotem do pożądanego stanu, a następnie wywołaj funkcję startActivity. stack jest warstwą ponad normalnym zadaniem/back-stosem, myślę, że modyfikowanie go "od środka" może powodować problemy i dlatego widzisz problem:

19

Najwyraźniej mój problem pojawił się w wywołaniu w trybie onActivityResult (...)

Udało mi się naprawić problem, umieszczając kod modyfikacji interfejsu użytkownika w Runnie, a następnie publikując Runnable do głównego wątku:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     // UI code here 
    } 
}; 
Handler h = new Handler(); 
h.post(r); 
+0

Człowieku, właśnie uratowałeś mój umysł. Prawie zwariowałem, próbując dowiedzieć się, co jest nie tak. +1 – Dimanoid

+0

Naprawiono problem, który miałem! Aktywność SingleTop, pojawienie się fragmentu backstack w onNewIntent. dodanie @UiThread do mojej metody z AndroidAnnotations naprawiło awarię. –

+6

zadzwoń do super.onActivityResult najpierw przed twoją logiką, a problem zostanie naprawiony jako FragmentActivity na onActivityresult wywołuje mFragments.noteStateNotSaved(); – Shilpi

14

wezwanie super.onActivityResult pierwszy przed logiką i emisji dostanie ustalona jako FragmentActivity za onActivityResult połączeń mFragments.noteStateNotSaved();

+0

Dzięki, uratowałeś mi dzień haha ​​ –

4

Ta odpowiedź jest może pomóc komuś. Kiedy twoja aktywność nie jest widoczna, nie możesz zadzwonić do popBackStackImmediate (...) spowoduje to niedozwolony wyjątek: nie można wykonać tej akcji po instancji onsaveinstancestate.

Zamiast tego możesz sprawdzić, czy aktywność jest widoczna czy nie? przed wywołaniem popBackStackImmediate().

Jeśli twoja aktywność nie jest widoczna, nie dzwoń do popBackStackImmediate. Poprzez flagę boolowską można uzyskać, gdy aktywność zostanie ponownie otwarta.

+0

Nie rozumiem ostatniej części. Więc jeśli moja aktywność nie jest widoczna, a ja nie wykonuję operacji, skąd będę wiedział, że powinienem to zrobić, gdy aktywność będzie widoczna? –

+0

Jeśli chcesz zadzwonić do popBackStackImmediate (...), gdy twoja aktywność nie jest widoczna. Ustaw wartość logiczną na true. Gdy twoja aktywność przejdzie na pierwszy plan, w działaniu onResume() możesz sprawdzić wartość logiczną, jeśli jest prawdziwa, możesz zadzwonić do popBackStackImmediate (...) – Thirumalvalavan

+0

Jak dokładnie? Czy możesz edytować swoją odpowiedź za pomocą przykładu kodu? –

Powiązane problemy