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
код, подобный этому, и переопределить метод.