Załóżmy, że chcę zastąpić bieżący fragment w widoku kontenera innym. Czy lepiej jest użyć wymiany ...
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, null);
ft.commit();
... lub następujące, z funkcją show and hide?
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.hide(oldFragment);
ft.show(newFragment);
ft.commit();
Czy można to zrobić bardziej wydajnie? Nie można znaleźć zbyt wielu informacji na temat tego, kiedy należy użyć tych metod lub jak wpływają one na cykl życia fragmentów, których to dotyczy. Dzięki!
android
android-fragments
Robert Karl
źródło
źródło
Odpowiedzi:
Powinieneś rozważyć, co planujesz zrobić z fragmentem, aby zdecydować, którą ścieżką podążać. Jeśli używasz FragmentTransaction, aby ukryć fragment, może on nadal znajdować się w stanie działania swojego cyklu życia, ale jego interfejs użytkownika został odłączony od okna, więc nie jest już widoczny. Możesz więc technicznie nadal wchodzić w interakcję z fragmentem i później ponownie dołączyć jego interfejs użytkownika. Jeśli zastąpisz fragment, faktycznie wyciągasz go z pojemnika i przejdzie on przez wszystkie zdarzenia porzucenia w cyklu życia (onPause, onStop itp.), A jeśli z jakiegoś powodu będziesz potrzebować tego fragmentu ponownie, będziesz musiał włóż go z powrotem do kontenera i pozwól mu przejść przez całą inicjalizację.
Jeśli istnieje duże prawdopodobieństwo, że będziesz potrzebować tego fragmentu ponownie, po prostu go ukryj, ponieważ ponowne narysowanie jego układu jest mniej kosztowną operacją niż jego całkowita ponowna inicjalizacja.
źródło
hide()
ishow()
zaoszczędzimy na tym! Dzięki za to!Zasadniczo odpowiedziałeś sobie. Jeśli chcesz zastąpić (więc stary fragment nie jest już potrzebny) użyj,
replace()
jeśli chcesz go tymczasowo ukryć, a następnie zróbhide()
.źródło
Użyłem metody hide / Show w mojej aktywności z 4 fragmentami, co rozwiązało moje rozwiązanie, ale czasami losowo, gdy pokazuję moje okno dialogowe, powoduje to wyjątek złego tokena okna, gdy użyłem metody add i replace, a następnie zły wyjątek tokena nie występuje, więc myślę, że pokaż / metoda ukrywania nie jest idealna
źródło