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 è !visibleinsetUserVisibleHint 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 BaseFragmentcodice come questo e sovrascrivere il metodo.