setUserVisibleHint()
est appelé parfois avant onCreateView()
et parfois après, ce qui cause des problèmes.
Pour surmonter cela, vous devez également vérifier la méthode isResumed()
interne setUserVisibleHint()
. Mais dans ce cas, j'ai réalisé que je ne suis setUserVisibleHint()
appelé que si le fragment est repris et visible, PAS lors de sa création.
Donc, si vous souhaitez mettre à jour quelque chose lorsque Fragment est visible
, mettez votre fonction de mise à jour à la fois dans onCreate()
et setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
MISE À JOUR: Je me suis quand même rendu compte que je suis myUIUpdate()
appelé parfois deux fois, la raison en est que si vous avez 3 onglets et que ce code est sur le 2e onglet, lorsque vous ouvrez le 1er onglet pour la première fois, le 2e onglet est également créé même s'il n'est pas visible et myUIUpdate()
est appelé. Ensuite, lorsque vous glissez vers le 2e onglet, myUIUpdate()
de if (visible && isResumed())
est appelé et, par conséquent, myUIUpdate()
peut être appelé deux fois en une seconde.
L'autre problème est !visible
dans setUserVisibleHint
obtient appelé à la fois 1) lorsque vous sortez de l'écran de fragment et 2) avant qu'il ne soit créé, lorsque vous passez à l'écran de fragment la première fois.
Solution:
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;
}
}
Explication:
fragmentResume
, fragmentVisible
: S'assure que myUIUpdate()
in onCreateView()
n'est appelé que lorsque le fragment est créé et visible, et non à la reprise. Il résout également le problème lorsque vous êtes au 1er onglet, le deuxième onglet est créé même s'il n'est pas visible. Cela résout cela et vérifie si l'écran de fragment est visible quand onCreate
.
fragmentOnCreated
: S'assure que le fragment n'est pas visible et n'est pas appelé lorsque vous créez un fragment pour la première fois. Alors maintenant, cette clause if n'est appelée que lorsque vous glissez hors du fragment.
Mise à jour
Vous pouvez mettre tout ce code dans du BaseFragment
code comme celui-ci et remplacer la méthode.