Android Fragments: ควรใช้ซ่อน / แสดงหรือเพิ่ม / ลบ / แทนที่เมื่อใด


117

สมมติว่าฉันต้องการแทนที่ส่วนปัจจุบันในมุมมองคอนเทนเนอร์บางส่วนด้วยอีกมุมมองหนึ่ง ใช้แทนดีกว่าไหม ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... หรือต่อไปนี้กับ show and hide?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

วิธีหนึ่งในการดำเนินการนี้มีประสิทธิภาพมากขึ้นหรือไม่? ไม่พบข้อมูลมากนักว่าเมื่อใดควรใช้วิธีการเหล่านี้หรือผลกระทบต่อวงจรชีวิตของชิ้นส่วนที่เกี่ยวข้องอย่างไร ขอบคุณ!


ถ้าฉันไปที่ส่วน B จากส่วน A แล้วกลับไปที่ส่วน A ฉันจะแน่ใจได้อย่างไรว่าเหตุการณ์วงจรชีวิตเช่น onCreateView ไม่ได้เรียกใช้ส่วน A? หาแฟรกเมนต์ตามแท็กทำงานหรือไม่
blackHawk

คำตอบ:


135

คุณควรพิจารณาว่าคุณวางแผนจะทำอะไรกับแฟรกเมนต์เพื่อตัดสินใจว่าจะเดินตามเส้นทางใด หากคุณใช้ FragmentTransaction เพื่อซ่อนแฟรกเมนต์นั้นจะยังคงอยู่ในสถานะการทำงานของวงจรชีวิต แต่ UI ถูกแยกออกจากหน้าต่างจึงไม่สามารถมองเห็นได้อีกต่อไป ดังนั้นในทางเทคนิคคุณยังสามารถโต้ตอบกับชิ้นส่วนและแนบ UI ของมันอีกครั้งในภายหลังที่คุณต้องการ หากคุณเปลี่ยนชิ้นส่วนแสดงว่าคุณกำลังดึงมันออกจากคอนเทนเนอร์จริงๆและมันจะผ่านเหตุการณ์การฉีกขาดทั้งหมดในวงจรชีวิต (onPause, onStop ฯลฯ ) และหากด้วยเหตุผลบางอย่างคุณต้องการชิ้นส่วนนั้นอีกครั้งคุณจะต้อง ใส่กลับเข้าไปในคอนเทนเนอร์และปล่อยให้มันทำงานผ่านการเริ่มต้นทั้งหมดอีกครั้ง

หากมีความเป็นไปได้สูงที่คุณจะต้องใช้ชิ้นส่วนนั้นอีกครั้งให้ซ่อนไว้เพราะมันเป็นการดำเนินการที่มีราคาไม่แพงในการวาดเค้าโครงใหม่กว่าที่จะเริ่มต้นใหม่ทั้งหมด


5
สำหรับความต้องการของเราการเริ่มต้นชิ้นส่วนนั้นค่อนข้างมีราคาแพงดังนั้นเราอาจจะไปด้วยhide()และshow()เพื่อประหยัดสิ่งนั้น! ขอบคุณสำหรับสิ่งนี้!
Robert Karl

2
สวัสดีเมื่อคุณพูดว่าถอดออกจากหน้าต่างคุณหมายถึงการโทรกลับ onDetach () หรือไม่? ฉันทดลองแล้วดูเหมือนว่าจะไม่เป็นเช่นนั้น
GingerJim

เขาอาจหมายถึง "แยก"; นอกจากนี้ยังสามารถแยกชิ้นส่วน / ติดตั้งใหม่ได้ (นอกจากนี้เพื่อเพิ่ม / ลบแสดง / ซ่อน)
comeGetSome

1
@ Zainodis ฉันก็มีปัญหาเหมือนกัน วิธีแก้ปัญหาของฉันคือบันทึกสถานะที่ซ่อนอยู่ของแฟรกเมนต์ใน onSaveInstanceState () - savedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); จากนั้นใน onCreate () ถ้า (saveInstanceState! = null) รับสถานะที่ซ่อนอยู่กลับมาและหากส่วนที่ซ่อนอยู่ให้ซ่อนด้วยธุรกรรม
worawee.s

1
@ worawee.s สวัสดีและขอบคุณสำหรับการอัพเดท :)! ฉันแก้ไขปัญหาเมื่อไม่นานมานี้ในตอนท้ายของฉัน - ฉันไม่ต้องการซ่อน / แสดง ฯลฯ จริงๆดังนั้นฉันจึงทิ้งมันไปอย่างสมบูรณ์และตอนนี้ฉันกำลังดำเนินการตามมาตรฐานเช่นกิจกรรมเพิ่ม / แทนที่หรือส่วนย่อยในบานหน้าต่างเดียว (ขั้นตอนรายละเอียดหลักโดยทั่วไป) . สำหรับผู้ที่ยังใช้การซ่อนโซลูชันของคุณจะเป็นประโยชน์มาก - และการไม่ตรวจสอบ saveInstance! = null เป็นหนึ่งในข้อผิดพลาดที่ฉันเคยทำมาก่อน
AgentKnopf

5

คุณตอบตัวเองโดยพื้นฐานแล้ว หากคุณต้องการที่จะเปลี่ยน (เพื่อให้ชิ้นส่วนเก่าไม่จำเป็น) การใช้งานถ้าคุณต้องการที่จะซ่อนมันชั่วคราวแล้วทำreplace()hide()


โดยทั่วไปแทนที่จะลบทั้งหมด ฉันไม่พบ hideAll ที่ตรงกัน :(
AlikElzin-kilaka

@ AlikElzin-kilaka ในกิจกรรมของฉัน 3 ส่วนในทั้งสามส่วนฉันดึงข้อมูลจากเครือข่ายว่าฉันควรทำตามวิธีใด
Mansukh Ahir

0

ฉันใช้วิธีซ่อน / แสดงในกิจกรรมของฉันด้วยเศษ 4 ชิ้นมันแก้ปัญหาของฉันได้ แต่บางครั้งก็สุ่มเมื่อฉันแสดงกล่องโต้ตอบของฉันมันให้ข้อยกเว้นโทเค็นที่ไม่ดีของหน้าต่างเมื่อฉันใช้วิธีการเพิ่มและแทนที่แล้วข้อยกเว้นโทเค็นที่ไม่ดีจะไม่เกิดขึ้นดังนั้นฉันจึงคิดว่าแสดง / วิธีซ่อนไม่สมบูรณ์แบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.