setUserVisibleHint()вызывается иногда до onCreateView() и иногда после чего вызывает проблемы.
Чтобы преодолеть это, вы должны проверить isResumed()также и внутренний setUserVisibleHint()метод. Но в данном случае я понял , setUserVisibleHint()вызывается только если фрагмент возобновляется и видно, НЕ при создании.
Поэтому, если вы хотите что-то обновить, когда Fragment установлен visible, поместите функцию обновления в onCreate()и setUserVisibleHint():
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
ОБНОВЛЕНИЕ: Тем не менее я понял, что myUIUpdate()иногда вызывается дважды, причина в том, что если у вас есть 3 вкладки, и этот код находится на 2-й вкладке, когда вы впервые открываете 1-ю вкладку, 2-я вкладка также создается, даже если она не видна и myUIUpdate()вызывается. Затем при переходе ко 2-й вкладке вызывается myUIUpdate()from if (visible && isResumed())и, как результат, myUIUpdate()может вызываться дважды в секунду.
Другая проблема заключается !visibleв том, что она вызывается setUserVisibleHintкак 1) при выходе из экрана фрагмента и 2) перед его созданием при первом переключении на экран фрагмента.
Решение:
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;
}
}
Объяснение:
fragmentResume, fragmentVisible: Убеждается myUIUpdate()в onCreateView()вызывается только когда фрагмент создан и видимый, а не резюме. Это также решает проблему, когда вы находитесь на первой вкладке, вторая вкладка создается, даже если она не видна. Это решает это и проверяет, виден ли фрагмент экрана когда onCreate.
fragmentOnCreated: Гарантирует, что фрагмент не виден и не вызывается при первом создании фрагмента. Так что теперь это, если предложение вызывается только когда вы проводите из фрагмента.
Обновление
Вы можете поместить весь этот код в BaseFragmentкод, подобный этому, и переопределить метод.