setUserVisibleHint()
ได้รับการเรียกบางครั้งก่อน onCreateView()
และบางครั้งหลังจากที่ทำให้เกิดปัญหา
หากต้องการเอาชนะสิ่งนี้คุณต้องตรวจสอบวิธีการisResumed()
ภายในsetUserVisibleHint()
ด้วย แต่ในกรณีนี้ฉันรู้ว่าsetUserVisibleHint()
ได้รับเรียกเฉพาะเมื่อชิ้นส่วนกลับมาทำงานต่อและมองเห็นได้ไม่ใช่เมื่อสร้าง
ดังนั้นหากคุณต้องการอัปเดตบางอย่างเมื่อมีแฟรกเมนต์visible
ให้ใส่ฟังก์ชั่นอัพเดทของคุณทั้งในonCreate()
และsetUserVisibleHint()
:
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
UPDATE:ฉันยังคงmyUIUpdate()
รับรู้ถึงการถูกเรียกสองครั้งเหตุผลคือถ้าคุณมี 3 แท็บและรหัสนี้อยู่บนแท็บที่ 2 เมื่อคุณเปิดแท็บที่ 1 เป็นครั้งแรกแท็บที่ 2 จะถูกสร้างขึ้นแม้ว่าจะมองไม่เห็นและmyUIUpdate()
ถูกเรียก จากนั้นเมื่อคุณปัดไปที่แท็บที่ 2 myUIUpdate()
จากif (visible && isResumed())
นั้นจะถูกเรียกใช้และmyUIUpdate()
อาจได้รับการเรียกสองครั้งในหนึ่งวินาที
อีกปัญหาเป็น!visible
ในsetUserVisibleHint
ได้รับการเรียกทั้ง 1) เมื่อคุณออกไปส่วนของหน้าจอและ 2) ก่อนที่มันจะถูกสร้างขึ้นเมื่อคุณสลับไปยังหน้าจอส่วนครั้งแรก
สารละลาย:
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;
}
}
คำอธิบาย:
fragmentResume
, fragmentVisible
: ทำให้แน่ใจว่าmyUIUpdate()
ในonCreateView()
ที่เรียกว่าเฉพาะเมื่อชิ้นส่วนถูกสร้างขึ้นและมองเห็นได้ในงาน นอกจากนี้ยังแก้ปัญหาเมื่อคุณอยู่ที่แท็บที่ 1 แท็บที่ 2 ถูกสร้างขึ้นแม้ว่าจะมองไม่เห็น วิธีนี้จะช่วยแก้ปัญหานั้นและตรวจสอบว่าหน้าจอชิ้นส่วนสามารถมองเห็นได้เมื่อonCreate
ใด
fragmentOnCreated
: ทำให้แน่ใจว่าไม่สามารถมองเห็นชิ้นส่วนและไม่ถูกเรียกเมื่อคุณสร้างชิ้นส่วนเป็นครั้งแรก ดังนั้นตอนนี้ถ้าประโยคเพียงได้รับการเรียกเมื่อคุณปัดออกจากส่วน
อัปเดต
คุณสามารถใส่รหัสนี้ทั้งหมดในBaseFragment
รหัสเช่นนี้และวิธีการแทนที่