ความแตกต่างและการใช้งานของ onCreate (), onCreateView () และ onActivityCreated () เป็นชิ้นส่วน


329

อะไรคือความแตกต่างระหว่างonCreate(), onCreateView()และonActivityCreated()ในชิ้นส่วนและสิ่งที่พวกเขาแต่ละคนจะนำมาใช้สำหรับ?


ดูเพิ่มเติมที่: stackoverflow.com/questions/27227906/…
แบรดลาร์สัน

@BradLarson ฉันไม่เข้าใจว่าทำไมถึงถูกปิด มันได้พิสูจน์แล้วว่าเป็นคำถามยอดนิยมและแตกต่างจากลิงค์ที่ระบุในความคิดเห็นของคุณ คำถามนี้ถามถึงความแตกต่างระหว่างสามวิธีที่แตกต่างกันและวิธีเปรียบเทียบกัน แต่คำถามที่คุณเชื่อมโยงในความคิดเห็นของคุณกล่าวถึงเพียงสองวิธีนี้
Farbod Salamat-Zadeh

@BradLarson ยุติธรรมพอและเห็นดี ถึงตอนนี้ที่ฉันมีความเข้าใจฉันไม่สามารถเขียนคำตอบที่เปรียบเทียบทั้งสามวิธีได้ดีกว่าโดยอ้างอิงลิงค์เพื่อดูรายละเอียดเพิ่มเติม?
Farbod Salamat-Zadeh

2
@ FarbodSalamat-Zadeh - แน่นอน ฉันได้เปิดคำถามอีกครั้งหากคุณคิดว่าคุณสามารถให้คำตอบที่ดีกว่าได้ ฉันไม่ต้องการปล่อยให้มันนั่งเฉยๆถ้าทำได้
แบรดลาร์สัน

คำตอบ:


394

onCreate ():

onCreate()วิธีการในFragmentจะเรียกว่าหลังจากที่Activity'sonAttachFragment()แต่ก่อนที่Fragment' onCreateView()s
ในวิธีนี้คุณสามารถกำหนดตัวแปรรับIntentสิ่งพิเศษและสิ่งอื่น ๆ ที่ไม่เกี่ยวข้องกับลำดับชั้นการดู (เช่นการเริ่มต้นที่ไม่ใช่กราฟิก) เพราะนี่คือวิธีการนี้สามารถเรียกได้ว่าเมื่อActivity's onCreate()ยังไม่เสร็จสิ้นและอื่น ๆ พยายามที่จะเข้าถึงดูลำดับชั้นของที่นี่อาจส่งผลให้เกิดความผิดพลาด

onCreateView ():

หลังจากที่onCreate()เรียกว่า (ในFragment) ที่Fragment's onCreateView()เรียกว่า คุณสามารถกำหนดของViewตัวแปรและทำ initialisations คุณคาดว่าจะส่งคืนViewจากวิธีนี้และนี่คือมุมมอง UI หลัก แต่หากคุณFragmentไม่ได้ใช้เลย์เอาต์หรือกราฟิกใด ๆ คุณสามารถส่งคืนได้null(โดยค่าเริ่มต้นหากคุณไม่ได้แทนที่)

onActivityCreated ():

ฐานะที่เป็นรัฐชื่อนี้จะเรียกว่าหลังจากที่Activity'sonCreate()ได้เสร็จสิ้น มันถูกเรียกหลังจากonCreateView()และส่วนใหญ่จะใช้สำหรับการเริ่มต้นขั้นสุดท้าย (ตัวอย่างเช่นการแก้ไของค์ประกอบ UI)


เพื่อสรุป ...
... พวกเขาทั้งหมดถูกเรียกในFragmentแต่ถูกเรียกในเวลาที่ต่างกัน จะเรียกว่าเป็นครั้งแรกสำหรับการทำ initialisations กราฟิกที่ไม่ใช่ใด ๆ ถัดไปคุณสามารถกำหนดและประกาศใด ๆตัวแปรที่คุณต้องการที่จะใช้ในการ หลังจากนั้นให้ใช้
onCreate()ViewonCreateView()onActivityCreated()ในการทำ initialisation ขั้นสุดท้ายที่คุณต้องการทำเมื่อทุกอย่างเสร็จสมบูรณ์


หากคุณต้องการดูเอกสาร Android อย่างเป็นทางการสามารถดูได้ที่นี่:
- - -onCreate()
onCreateView()
onActivityCreated()

นอกจากนี้ยังมีข้อแตกต่างกันเล็กน้อย แต่มีคำถาม / คำตอบที่พัฒนาแล้วน้อยลงที่ Stack overflow:


6
ฉันคิดว่าฉันจะใช้การเริ่มต้นกราฟิกที่ไม่ใช่ onCreate () เพื่อที่พวกเขาจะไม่ถูกเรียกอีกครั้งเมื่อหน้าจอหมุน ปรากฎว่าฉันต้องเรียก fragment.setRetainInstance (จริง) มิฉะนั้นทั้ง onCreate () และ onCreateView () จะถูกเรียกอีกครั้งเมื่อหน้าจอหมุน
ผักแช่ง

ใน onCreateView () นั้นปลอดภัยในการเข้าถึงลำดับชั้นการดูหรือไม่?
โคดี

@Cody ผมเชื่อว่าดังนั้น - onCreateViewเข้าถึงลำดับชั้นดูเป็นจุดประสงค์ที่แท้จริงของ
Farbod Salamat-Zadeh

1
อย่างไรก็ตามกิจกรรมของ onCreate () อาจไม่เสร็จสิ้นจนกว่า onActivityCreated ()? นี่เป็นโอกาสที่จะเกิดความผิดพลาดใน onCreateView เพื่อเข้าถึงลำดับชั้นการดูไหม ฉันไม่แน่ใจว่าสิ่งที่แตกต่างระหว่าง onCreateView () / onActivityCreated ()
Cody

1
สิ่งหนึ่งที่ควรทราบ (อย่างน้อยกับ AppCompatActivity) คือเมื่อกิจกรรมถูกสร้างขึ้นใหม่ (เช่นหลังจากที่ถูกย่อให้เล็กสุดและถูกฆ่า) ชิ้นส่วน onCreate () จะถูกเรียกใช้ก่อนที่กิจกรรม onCreate () และ super.onCreate () จะเสร็จสิ้น นี่อาจเป็นปัญหาหากคุณใช้บางอย่างเช่น Dagger และจำเป็นต้องเข้าถึงบางสิ่งในกิจกรรมหลักที่ถูกฉีด วิธีหนึ่งในการแก้ปัญหานี้คือการใส่รหัสใน onActivityCreated () ซึ่งเรียกว่าเสมอเรียกว่า onCreate () เรียกว่า
นิโคลัส

144

สำหรับทุกคนที่กำลังมองหาคำตอบที่กระชับรูปภาพ:

ป้อนคำอธิบายรูปภาพที่นี่ https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


และ,

ป้อนคำอธิบายรูปภาพที่นี่


21
ตกลง Comic Sans เป็นสิ่งจำเป็นสำหรับสิ่งนี้
Kartik Chugh

1
นี่เป็นครั้งแรกที่ฉันเห็นแบบอักษร 3 แบบในแผนภาพเดียวกันและตอนนี้ชีวิตของฉันก็รู้สึกสมบูรณ์
Gil Sand

เมื่อใดที่ชิ้นส่วนสามารถเริ่มต้นใหม่ได้อย่างแน่นอน
Saurabh

1
ทำไมชิ้นส่วนถึงไม่ถูกสร้างขึ้นใหม่เมื่อกระบวนการตายแล้ว? AFAIK เฉพาะสถานะงานที่เก็บรักษาไว้เป็นกลุ่มและสร้างขึ้นมาใหม่แอปจะถูกนำไปสู่เบื้องหน้าอีกครั้ง
stdout

6

onActivityCreated () - เลิกใช้แล้ว

onActivityCreated()เลิกใช้แล้วในขณะนี้เป็น Fragments Version 1.3.0-alpha02

เมธอด onActivityCreated () เลิกใช้แล้ว โค้ดที่สัมผัสมุมมองของแฟรกเมนต์ควรทำใน onViewCreated () (ซึ่งถูกเรียกใช้ทันทีก่อน onActivityCreated ()) และโค้ดการเริ่มต้นอื่น ๆ ควรอยู่ใน ในการรับการเรียกกลับเฉพาะเมื่อ onCreate () ของกิจกรรมเสร็จสิ้น LifeCycleObserver ควรลงทะเบียนกับ Lifecycle ของกิจกรรมใน onAttach () และลบออกเมื่อได้รับการเรียกกลับ onCreate ()

ข้อมูลรายละเอียดสามารถดูได้ที่นี่

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