2011-08-02 9 views
5

Próbuję zapisać podklasę ListFragment przez zmianę orientacji, więc dodałem setRetainInstance (true) na końcu mojej funkcji onCreate. Dodałem metodę onSaveInstanceState, aby dodać wszystkie dane do pakietu, a następnie dodałem kod do onActivityCreated, aby załadować te dane z powrotem. Niestety, to nie zadziała.setRetainInstance nie działa dla ListFragment przy użyciu biblioteki compatibiltiy

Kiedy dodałem kilka komunikatów do debugowania za pomocą Log.d Stwierdziłem, że nie tylko nie był wywoływany onSaveInstanceState, ale onCreate był (który wydaje się twierdzić, że dokumentacja nie powinna się zdarzyć, gdy wartość retainInstance jest prawdziwa). Ani onCreate, ani onActivityCreated nie zawierają pakietów z moimi danymi (nieoczekiwanie).

Zgaduję, że to może być problem z biblioteką kompatybilności, chociaż nie mam urządzenia Android 3.0+, aby to przetestować.

Każda pomoc jest doceniana i mogę opublikować niektóre fragmenty kodu, jeśli to konieczne, ale nie robię nic skomplikowanego.

Aktualizacja: onDestroy nie jest wywoływana podczas zmiany orientacji (co jest jak powinno być), więc wydaje się, że niektóre z setRetainInstance pracuje

+1

Proponuję debugowanie kompatybilnej biblioteki, aby zobaczyć, co się dzieje. Z jakiej wersji biblioteki kompatybilnej korzystasz? Używam r1 i unikałem r2, ponieważ występuje co najmniej jeden błąd regresji z tym, że onDestroy nie jest wywoływany, gdy fragment jest zamieniany. – PJL

+0

Używam r3, będę szukać starszej wersji, aby sprawdzić, czy to pomaga. Wszelkie sugestie dotyczące debugowania biblioteki compat? Jestem bardzo nowy, aby debugować Javę. – rofer

+0

Po prostu spróbuj przejść do jednej z metod kompatybilnej biblioteki i powinieneś otrzymać monit o lokalizację źródeł. – PJL

Odpowiedz

10

I w końcu zorientowali się, co było moim problemem. Wszystko sprowadzało się do pojedynczej linii, której zapomniałem dodać. W mojej podklasie FragmentActivity przeskoczyłem naSaveInstanceState, ale nigdy nie zadzwoniłem do super.onSaveInstanceState. Wygląda na to, że w przeciwieństwie do innych metod, których rodziców zapomniałem zadzwonić, funkcja onSaveInstanceState nie rzuci błędu runtime, gdy zapomnę wywołać wersję klasy nadrzędnej, zamiast tego setRetainInstance przestaje działać. Mam nadzieję, że to uratuje komuś ból głowy, przez który przeszedłem, próbując rozwiązać ten problem.

+1

Właśnie miałem do czynienia z tym samym problemem. Chodzi o to, że nie jesteś zobowiązany do nazwania metody nadklasy, ale fragmenty nie zostaną zachowane, jeśli tego nie zrobisz. Musiałem przejrzeć kod źródłowy biblioteki kompilacji, aby to zrozumieć. – Malcolm

+1

@rofer Nie musisz zaimplementować metody onSaveInstanceState, aby setRetainInstance działał? –

1

Wydaje się, że po ustawieniu setRetainInstance = true podczas wywoływania obu onSaveInstanceState() i onActivityCreated(), wówczas Bundle nie zostanie zwrócony.

Jednak jako, że jako ListFragment jest zachowywany, można po prostu zapisać jego stan w polu i obsługiwać go wewnątrz onActivityCreated().

Pamiętaj, że Activity nadal będzie niszczone i odtwarzane.

Powiązane problemy