setUserVisibleHint()
đôi khi được gọi onCreateView()
và đôi khi sau đó gây rắc rối.
Để khắc phục điều này bạn cần kiểm tra isResumed()
bên trong setUserVisibleHint()
phương pháp. Nhưng trong trường hợp này tôi nhận ra setUserVisibleHint()
được gọi là chỉ nếu Fragment thi đấu trở lại và có thể nhìn thấy, không phải khi tạo.
Vì vậy, nếu bạn muốn cập nhật một cái gì đó khi Fragment visible
, hãy đặt chức năng cập nhật của bạn cả trong onCreate()
và setUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
CẬP NHẬT:myUIUpdate()
Đôi khi tôi nhận ra được gọi hai lần, lý do là, nếu bạn có 3 tab và mã này nằm trên tab thứ 2, khi bạn mở tab thứ nhất, tab thứ 2 cũng được tạo ngay cả khi nó không hiển thị và myUIUpdate()
được gọi. Sau đó, khi bạn vuốt sang tab thứ 2, myUIUpdate()
từ đó if (visible && isResumed())
được gọi và kết quả là,myUIUpdate()
có thể được gọi hai lần trong một giây.
Người kia vấn đề là !visible
ởsetUserVisibleHint
cả hai được gọi là 1) khi bạn rời khỏi màn hình phân đoạn và 2) trước khi nó được tạo, khi bạn chuyển sang màn hình phân đoạn lần đầu tiên.
Giải pháp:
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;
}
}
Giải trình:
fragmentResume
, fragmentVisible
: Tạo sự chắc chắn myUIUpdate()
trong onCreateView()
được gọi là chỉ khi đoạn được tạo ra và có thể nhìn thấy, không phải trên sơ yếu lý lịch. Nó cũng giải quyết vấn đề khi bạn ở tab 1, tab thứ 2 được tạo ngay cả khi nó không hiển thị. Điều này giải quyết điều đó và kiểm tra xem màn hình mảnh có thể nhìn thấy khi nào onCreate
.
fragmentOnCreated
: Đảm bảo đoạn không hiển thị và không được gọi khi bạn tạo đoạn đầu tiên. Vì vậy, bây giờ mệnh đề if này chỉ được gọi khi bạn vuốt ra khỏi đoạn.
Cập nhật
Bạn có thể đặt tất cả mã này vào BaseFragment
mã như thế này và phương thức ghi đè.