setUserVisibleHint()é chamado algumas vezes antes onCreateView() e outras depois, o que causa problemas.
Para superar isso, você precisa verificar isResumed()também o setUserVisibleHint()método interno . Mas, nesse caso, percebi que sósetUserVisibleHint() é chamado se o Fragmento for retomado e visível, NÃO quando criado.
Portanto, se você deseja atualizar algo quando o Fragment estiver visible, coloque sua função de atualização em onCreate()e setUserVisibleHint():
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
ATUALIZAÇÃO: Ainda assim, eu percebi que myUIUpdate()é chamado duas vezes às vezes, o motivo é que, se você tiver 3 guias e esse código estiver na 2ª guia, quando você abrir a 1ª guia, a 2ª guia também será criada, mesmo que não seja visível e myUIUpdate()seja chamada. Então, quando você desliza para a 2ª guia, myUIUpdate()from if (visible && isResumed())é chamado e, como resultado, myUIUpdate()pode ser chamado duas vezes em um segundo.
O outro problema é !visibleem setUserVisibleHinté chamado tanto 1) quando você sai da tela fragmento e 2) antes de ser criado, quando você alternar para a tela fragmento primeira vez.
Solução:
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;
}
}
Explicação:
fragmentResume, fragmentVisible: Garante myUIUpdate()em onCreateView()é chamado somente quando fragmento é criado e visível, não no currículo. Também resolve o problema quando você está na 1ª guia, a segunda guia é criada mesmo que não esteja visível. Isso resolve e verifica se a tela do fragmento está visível quando onCreate.
fragmentOnCreated: Garante que o fragmento não esteja visível e não seja chamado quando você criar um fragmento pela primeira vez. Então agora essa cláusula if só é chamada quando você desliza para fora do fragmento.
Atualização
Você pode colocar todo esse código em um BaseFragmentcódigo como este e substituir o método.