setUserVisibleHint()
jest wywoływany czasami przed, onCreateView()
a czasem po którym powoduje problemy.
Aby temu zaradzić trzeba sprawdzić isResumed()
, jak również wewnątrz setUserVisibleHint()
metody. Ale w tym przypadku zdałem sobie sprawę, że setUserVisibleHint()
zostanie wywołane tylko wtedy, gdy Fragment zostanie wznowiony i będzie widoczny, NIE po utworzeniu.
Więc jeśli chcesz zaktualizować gdy fragment jest czymś visible
, umieścić zarówno w funkcji aktualizacji onCreate()
i setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
AKTUALIZACJA: Nadal zdaję sobie sprawę myUIUpdate()
, że czasami wywoływane są dwa razy, ponieważ jeśli masz 3 karty, a ten kod znajduje się na drugiej karcie, po pierwszym otwarciu pierwszej karty tworzona jest również druga karta, nawet jeśli nie jest widoczna i myUIUpdate()
jest wywoływana. Następnie po przesunięciu do drugiej zakładki wywoływana jest opcja myUIUpdate()
from , if (visible && isResumed())
w wyniku czego myUIUpdate()
może zostać wywołana dwukrotnie w ciągu sekundy.
Drugim problemem jest !visible
w setUserVisibleHint
momęcie zarówno 1), gdy wyjdziesz z fragmentu ekranu i 2), zanim zostanie utworzony, po przełączeniu na ekranie fragment raz pierwszy.
Rozwiązanie:
private boolean fragmentResume=false;
private boolean fragmentVisible=false;
private boolean fragmentOnCreated=false;
...
@Override
public View onCreateView(...){
...
//Initialize variables
if (!fragmentResume && fragmentVisible){ //only when first time fragment is created
myUIUpdate();
}
...
}
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){ // only at fragment screen is resumed
fragmentResume=true;
fragmentVisible=false;
fragmentOnCreated=true;
myUIUpdate();
}else if (visible){ // only at fragment onCreated
fragmentResume=false;
fragmentVisible=true;
fragmentOnCreated=true;
}
else if(!visible && fragmentOnCreated){// only when you go out of fragment screen
fragmentVisible=false;
fragmentResume=false;
}
}
Wyjaśnienie:
fragmentResume
, fragmentVisible
: Sprawia, że myUIUpdate()
in onCreateView()
jest wywoływane tylko wtedy, gdy fragment jest tworzony i widoczny, a nie przy wznowieniu. Rozwiązuje również problem, gdy jesteś na 1. karcie, 2. karta jest tworzona, nawet jeśli nie jest widoczna. To rozwiązuje i sprawdza, czy fragment ekranu jest widoczny, kiedy onCreate
.
fragmentOnCreated
: Sprawia, że fragment nie jest widoczny i nie jest wywoływany przy pierwszym utworzeniu fragmentu. Więc teraz, jeśli klauzula zostanie wywołana tylko po przesunięciu fragmentu.
Aktualizacja
Możesz umieścić cały ten kod w BaseFragment
kodzie takim jak ten i zastąpić metodę.