Próbuję zrozumieć, jak zachować stan widoku fragmentu, gdy fragmenty są używane w kartach nawigacyjnych. W moich wysiłkach natrafiłem na dwa problemy, na które nie mogę znaleźć właściwych rozwiązań.Karty nawigacyjne systemu Android: Przywracanie stanu widoku fragmentów
Mam dwie karty Tab1 i Tab2. Układ Tab1 jest zdefiniowany przez FragmentA, a układ Tab2 jest zdefiniowany przez FragmentB. Mam następnie podejście podane tutaj: Adding navigation tabs
Pierwszy problem: Choć moje poglądy mają identyfikatory, ich kraje nie są w pełni przywrócona, gdy fragment jest ponownie załączony (po obróceniu przełącznika Tab). W szczególności: EditText z identyfikatorem rzeczywiście zapisuje wprowadzony tekst, ale NIE zapisuje on swojego statusu włączonego. Również moje przyciski nie zapisują, jeśli są włączone lub wyłączone, mimo że mają identyfikatory. Znalazłem dwa możliwe rozwiązania dla tego problemu:
- Wpisz
hide()/show()
zamiastattach()/detach()
podczas przełączania kart. - w
onPause()
zapisz bieżący stan widoku fragmentu w zmiennej instancjiView
fragmentu poprzezgetView()
. W poluonCreateView(Bundle savedInstanceState)
sprawdź, czy to pole ma wartość inną niż null, a jeśli tak jest, zwróć wartość tego pola. To rozwiązanie wydaje się być hacky i powiedziano mi, że może to również spowodować wyciek pamięci w mojej aplikacji.
Drugi problem: Rozważmy następujący interakcji użytkownika: użytkownika zaczyna się na Wypustu1 i robi kilka zmian, które wprowadzone stan widoku Wypustu1 w innym stanie niż jego stanu domyślnego (i chcemy fragment zapisać ten stan widoku za pomocą przełączników tabulatorów i urządzeń przechylonych). Użytkownik przechodzi do Tab2. Użytkownik następnie przechyla swoje urządzenie (nadal w Tab2). Użytkownik przełącza się następnie na Tab1 (przy nowej orientacji ekranu). Problem polega na tym, że: Kiedy użytkownik początkowo zamienia się z Tab1 na Tab2, fragment jest odłączany, a jego widok jest odrzucany (nawet jeśli instancja fragmentu nadal istnieje). Kiedy użytkownik przechyla urządzenie, aktywność - a przez to zarówno FragmentA jak i FragmentB z nim związane - zostają zniszczone. Ponieważ FragmentA w tym miejscu nie ma już widoku (pamiętaj: został odłączony) nie możemy zapisać stanu jego elementów widoku (np. Które przyciski są włączone/wyłączone) podczas połączenia z FragmentA.onSaveInstanceState(Bundle savedInstanceState)
. Jak odzyskasz stan widoku fragmentu w takiej sytuacji? Czy jedynym możliwym rozwiązaniem jest zapisanie wszystkich flag statusu poszczególnych elementów widoku jako SharedPreferences? Wydaje się to zbyt skomplikowane dla takiej "codziennej pracy".
Byłem na całym SO i różnych blogach, ale nie byłem w stanie znaleźć rozwiązania tego (konkretnego) problemu.
Wielkie dzięki - dobre wyjaśnienie. Jednak nadal nie wszystko jest dla mnie jasne. Napotkałem odpowiedź, na którą się powołujesz, ale nie udało mi się zrozumieć jej użycia. Co to jest "CustomView"? Stan widoku mojego fragmentu składa się z wbudowanych widoków (takich jak EditTexts, przyciski itd.). Dlatego nie rozszerzyłem żadnych klas widoku - po prostu zbudowałem widok fragmentów w pliku układu XML. Jak mogę podłączyć przykładowy kod podany w odpowiedzi do mojego layoutu, który nie używa żadnych zdefiniowanych przez użytkownika widoków (zakładając, że CustomView jest dla androida czym jest formant zdefiniowany przez użytkownika w ASP .NET)? –
@jvmk Aby użyć metody View.onSaveInstanceState(), należy podklasować widok i zastąpić tę metodę. Twój układ XML musi odwoływać się do tych nowych widoków zamiast do EditText/Button. – antonyt
Woah, to szalone. Sądziłem, że przywrócenie stanu widoku wbudowanych widoków będzie zadaniem, które często powraca na tyle często, aby można je było obsłużyć jako standardową funkcję. Przypuśćmy, że powinienem napisać bibliotekę do wykorzystania w przyszłości. Dzięki, że mi pomogłeś. To mnie denerwuje od 2 tygodni, heh. –