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 é !visible
em 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 BaseFragment
código como este e substituir o método.