setUserVisibleHint()
dipanggil kadang-kadang sebelum onCreateView()
dan kadang-kadang setelah yang menyebabkan masalah.
Untuk mengatasinya Anda perlu memeriksa isResumed()
juga setUserVisibleHint()
metode di dalam . Tetapi dalam hal ini saya menyadari setUserVisibleHint()
dipanggil hanya jika Fragmen dilanjutkan dan terlihat, BUKAN saat Dibuat.
Jadi, jika Anda ingin memperbarui sesuatu ketika Fragment berada visible
, masukkan fungsi pembaruan Anda di onCreate()
dan setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
UPDATE: Masih saya menyadari myUIUpdate()
dipanggil dua kali kadang-kadang, alasannya adalah, jika Anda memiliki 3 tab dan kode ini ada di tab ke-2, ketika Anda pertama kali membuka tab ke-1, tab ke-2 juga dibuat meskipun tidak terlihat dan myUIUpdate()
dipanggil. Kemudian ketika Anda menggeser ke tab ke-2, myUIUpdate()
dari if (visible && isResumed())
dipanggil dan sebagai hasilnya, myUIUpdate()
dapat dipanggil dua kali dalam satu detik.
Yang lain masalah adalah !visible
di setUserVisibleHint
dipanggil kedua 1) ketika Anda pergi keluar dari layar fragmen dan 2) sebelum diciptakan, ketika Anda beralih ke layar fragmen pertama kalinya.
Larutan:
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;
}
}
Penjelasan:
fragmentResume
, fragmentVisible
: Memastikan myUIUpdate()
di onCreateView()
disebut hanya ketika fragmen dibuat dan terlihat, tidak di resume. Ini juga memecahkan masalah ketika Anda berada di tab ke-1, tab ke-2 dibuat bahkan jika itu tidak terlihat. Ini menyelesaikan itu dan memeriksa apakah layar fragmen terlihat saat onCreate
.
fragmentOnCreated
: Memastikan fragmen tidak terlihat, dan tidak dipanggil saat Anda membuat fragmen pertama kali. Jadi sekarang ini jika klausa hanya dipanggil ketika Anda menggesek fragmen.
Pembaruan
Anda dapat memasukkan semua kode ini dalam BaseFragment
kode seperti ini dan mengganti metode.