Mam dość duży problem i nie do końca rozumiem, co się dzieje. Zajmuję się tworzeniem aplikacji korzystającej z Fragmentów (z biblioteki wsparcia) i używam FragmentTransaction.replace()
do umieszczania nowych Fragmentów na stosie wstecznym i zastępowania starego. Kod wygląda następująco:Fragment systemu Android Zobacz Utratę stanu przy użyciu FragmentTransaction.replace()
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = ft.beginTransaction();
// Animations in my res/anim folder
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
Pomoże to w zastąpieniu mojego fragmentu. Mój problem jest następujący. W jednym fragmencie mam listę elementów zbudowanych na podstawie danych wprowadzanych przez użytkownika. Teraz, gdy użytkownik kliknie następny, a następnie kliknie przycisk Wstecz (aby powrócić do listy), lista jest pusta, ponieważ widok jest niszczony. Teraz, zauważyłem następujące:
- onSaveInstanceState nie jest wywoływana. Sądzę, że dzieje się tak dlatego, że jest to wywoływane tylko wtedy, gdy aktywna jest akcja rodzica. Na podstawie dokumentów: "Istnieje wiele sytuacji, w których fragment może być w większości zburzony (np. Po umieszczeniu go na tylnym stosie bez wyświetlania interfejsu użytkownika), ale jego stan nie zostanie zapisany, dopóki jego własna aktywność rzeczywiście nie uratuje jego stanu . ". Wygląda na to, że zastąpienie FragmentTransaction nie jest jednym z tych czasów. Czy ktoś ma potwierdzenie tego lub lepszego wyjaśnienia?
- setOnRetainInstanceState (true) nie jest pomocne w tej sytuacji. Ponownie, uważam, że ma to związek z informacjami z dokumentów: "Kontroluj, czy instancja fragmentu jest zachowywana podczas ponownego tworzenia aktywności (na przykład ze zmiany konfiguracji)". Nie wykonuję żadnych czynności podczas ponownego tworzenia działania, więc to nie ma sensu.
Zgaduję, że moje główne pytanie brzmi: czy istnieje sposób na zachowanie stanu widoku (po prostu zatrzymanie fragmentu) podczas korzystania z replace
? Jest FragmentTransaction.add()
, ale jest też kilka problemów z tym. Jedną z nich jest to, że animacja wyjścia nie jest wykonywana, dlatego animacja nie jest poprawna. Innym jest, że nowy Fragment, który stary fragment (ten, który jest wprowadzany w stanie niewidocznym) jest wciąż klikalny. Na przykład, jeśli mam obiekt ListFragment i umieszczam na nim fragment zawartości za pomocą polecenia dodawania, nadal można kliknąć elementy listy w obiekcie ListFragment.