setUserVisibleHint()
viene chiamato a volte prima onCreateView()
e talvolta dopo che causa problemi.
Per ovviare a questo è necessario controllare isResumed()
anche il setUserVisibleHint()
metodo interno . Ma in questo caso ho capito che setUserVisibleHint()
viene chiamato solo se il frammento viene ripreso e visibile, NON quando viene creato.
Quindi, se vuoi aggiornare qualcosa quando Fragment è visible
, inserisci la tua funzione di aggiornamento sia in onCreate()
che setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
AGGIORNAMENTO: Ancora mi sono reso conto che a myUIUpdate()
volte viene chiamato due volte, il motivo è che se hai 3 schede e questo codice è nella seconda scheda, quando apri la prima scheda per la prima volta, viene creata anche la seconda scheda anche se non è visibile e myUIUpdate()
viene chiamata. Quindi quando si passa alla seconda scheda, myUIUpdate()
da if (visible && isResumed())
viene chiamato e, di conseguenza, myUIUpdate()
può essere chiamato due volte al secondo.
L'altro problema è !visible
insetUserVisibleHint
viene chiamato sia 1) quando si va fuori dello schermo frammento e 2) prima che venga creato, quando si passa alla schermata frammento prima volta.
Soluzione:
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;
}
}
Spiegazione:
fragmentResume
, fragmentVisible
: Verifica che myUIUpdate()
in onCreateView()
venga chiamato solo quando il frammento viene creato e visibile, non al riavvio. Risolve anche il problema quando si è alla prima scheda, la seconda scheda viene creata anche se non è visibile. Questo risolve e controlla se lo schermo del frammento è visibile quando onCreate
.
fragmentOnCreated
: Assicura che il frammento non sia visibile e non venga chiamato quando si crea il frammento la prima volta. Quindi ora questa clausola if viene chiamata solo quando si scorre il frammento.
Aggiornamento
È possibile inserire tutto questo codice in BaseFragment
codice come questo e sovrascrivere il metodo.