setUserVisibleHint()
bazen önce onCreateView()
ve bazen sonra sorun olur.
Bunun üstesinden gelmek için isResumed()
iç setUserVisibleHint()
yöntemi de kontrol etmeniz gerekir . Ancak bu durumda setUserVisibleHint()
, sadece Parçanın devam ettirildiği ve görülebildiği durumlarda yaratıldığını farkettim , yaratıldığında DEĞİL.
Eğer Fragment olan güncelleme şey istiyorsanız visible
, hem sizin güncelleme fonksiyonunu koydu onCreate()
ve setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
GÜNCELLEME: Hala farkettim ki myUIUpdate()
bazen iki kez çağrılır, nedeni, 3 sekmeniz varsa ve bu kod 2. sekmede ise, ilk sekmeyi açtığınızda, 2. sekme de görünmez ve myUIUpdate()
çağrıldığında bile oluşturulur . Eğer 2 sekmesine tokatlamak Ardından, myUIUpdate()
gelen if (visible && isResumed())
denir ve bunun sonucu olarak, myUIUpdate()
bir saniye içinde iki kez adlı olabilir.
Diğer sorun ise !visible
de setUserVisibleHint
çağrılan hem 1) parçası ekran ilk kez geçtiğinizde, oluşturulmadan önce parça ekrana ve 2), dışarı giderken.
Çözüm:
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;
}
}
Açıklama:
fragmentResume
, fragmentVisible
: Emin yapar myUIUpdate()
içinde onCreateView()
parçası değil özgeçmiş, oluşturulan ve görünür olduğunda çağrılır. Ayrıca 1. sekmede olduğunuzda da sorunu çözer, görünür olmasa bile 2. sekme oluşturulur. Bu, bunu çözer ve parça ekranının ne zaman görünür olup olmadığını kontrol eder onCreate
.
fragmentOnCreated
: Parçanın görünür olmadığından ve ilk kez parça oluşturduğunuzda çağrılmadığından emin olur. Şimdi bu madde sadece parçayı hızlıca kaydırdığınızda çağrılırsa.
Güncelle
Tüm bu BaseFragment
kodu böyle bir koda koyabilir ve yöntemi geçersiz kılabilirsiniz.