setUserVisibleHint()
se llama a veces antes onCreateView()
y a veces después de lo cual causa problemas.
Para superar esto, debe verificar isResumed()
también el setUserVisibleHint()
método interno . Pero en este caso, me di cuenta de que solosetUserVisibleHint()
se llama si Fragment se reanuda y es visible, NO cuando se crea.
Entonces, si desea actualizar algo cuando Fragment es visible
, coloque su función de actualización en onCreate()
y setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
ACTUALIZACIÓN: Todavía me di cuenta de que a myUIUpdate()
veces se llama dos veces, la razón es que si tiene 3 pestañas y este código está en la segunda pestaña, cuando abre la primera pestaña, la segunda pestaña también se crea, incluso si no es visible y myUIUpdate()
se llama. Luego, cuando desliza a la segunda pestaña, myUIUpdate()
desde if (visible && isResumed())
se llama y, como resultado, myUIUpdate()
puede llamarse dos veces en un segundo.
El otro problema es !visible
en setUserVisibleHint
obtiene la llamada tanto 1) cuando sale de la pantalla y el fragmento 2) antes de que se crea, cuando se cambia a la pantalla fragmento primera vez.
Solución:
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;
}
}
Explicación:
fragmentResume
, fragmentVisible
: Se asegura myUIUpdate()
de que onCreateView()
se invoca solo cuando se crea un fragmento y está visible, no en el currículum. También resuelve el problema cuando está en la primera pestaña, la segunda pestaña se crea incluso si no está visible. Esto resuelve eso y comprueba si la pantalla de fragmentos es visible cuando onCreate
.
fragmentOnCreated
: Se asegura de que el fragmento no sea visible y no se llame cuando se crea un fragmento por primera vez. Así que ahora esta cláusula if solo se llama cuando deslizas el fragmento.
Actualización
Puede poner todo este código en un BaseFragment
código como este y anular el método.