Sự khác biệt và cách sử dụng onCreate (), onCreateView () và onActivityCreated () trong các đoạn


328

Sự khác biệt giữa onCreate(), onCreateView()onActivityCreated()trong các mảnh và mỗi cái chúng sẽ được sử dụng để làm gì?



@BradLarson Tôi không hiểu tại sao điều này đã bị đóng cửa. Nó đã được chứng minh là một câu hỏi tương đối phổ biến và khác với liên kết được nêu trong bình luận của bạn. Câu hỏi này là yêu cầu sự khác biệt giữa ba phương pháp khác nhau và cách chúng so sánh với nhau nhưng câu hỏi bạn liên kết trong nhận xét của bạn chỉ đề cập đến hai trong số các phương pháp này.
Farbod Salamat-Zadeh

@BradLarson Hội chợ đủ và phát hiện tốt. Bây giờ mặc dù tôi có một sự hiểu biết, tôi có thể không viết một câu trả lời so sánh tốt hơn ba phương pháp, tham khảo các liên kết để biết thêm chi tiết?
Farbod Salamat-Zadeh

2
@ FarbodSalamat-Zadeh - Chắc chắn rồi. Tôi đã mở lại câu hỏi, nếu bạn nghĩ rằng bạn có thể cung cấp một câu trả lời tốt hơn. Tôi chỉ không muốn để nó ngồi yên mà không trả lời nếu có thể.
Brad Larson

Câu trả lời:


393

onCreate ():

Các onCreate()phương pháp trong một Fragmentđược gọi sau khi Activity'sonAttachFragment() nhưng trước đó Fragment' s onCreateView().
Trong phương pháp này, bạn có thể gán các biến, nhận các Intenttính năng bổ sung và bất kỳ thứ gì khác không liên quan đến hệ thống phân cấp Chế độ xem (nghĩa là khởi tạo phi đồ họa). Điều này là do phương pháp này có thể được gọi khi Activity's onCreate()là chưa kết thúc, và do đó cố gắng truy cập vào hệ thống phân cấp Xem ở đây có thể dẫn đến một vụ tai nạn.

onCreateView ():

Sau khi onCreate()được gọi (trong Fragment), Fragment's onCreateView()được gọi. Bạn có thể chỉ định các Viewbiến của mình và thực hiện bất kỳ khởi tạo đồ họa nào . Bạn sẽ trả về một Viewtừ phương thức này và đây là chế độ xem UI chính, nhưng nếu bạn Fragmentkhông sử dụng bất kỳ bố cục hoặc đồ họa nào, bạn có thể quay lại null(xảy ra theo mặc định nếu bạn không ghi đè).

onActivityCreated ():

Theo các tiểu bang tên, điều này được gọi sau khi Activity's onCreate()đã hoàn thành . Nó được gọi sau onCreateView()và chủ yếu được sử dụng cho các lần khởi tạo cuối cùng (ví dụ: sửa đổi các thành phần UI).


Tóm lại ...
tất cả chúng đều được gọi trong Fragmentnhưng được gọi vào những thời điểm khác nhau.
Cái onCreate()này được gọi đầu tiên, để thực hiện bất kỳ khởi tạo phi đồ họa nào. Tiếp theo, bạn có thể gán và khai báo bất kỳ Viewbiến nào bạn muốn sử dụng onCreateView(). Sau đó, sử dụng onActivityCreated()để thực hiện bất kỳ khởi tạo cuối cùng nào bạn muốn làm sau khi mọi thứ đã hoàn thành.


Nếu bạn muốn xem tài liệu chính thức của Android, bạn có thể tìm thấy ở đây:
- - -onCreate()
onCreateView()
onActivityCreated()

Ngoài ra còn có một số câu hỏi / câu trả lời hơi khác, nhưng kém phát triển hơn ở đây trên Stack Overflow:


6
Tôi nghĩ rằng tôi sẽ triển khai các khởi tạo đồ họa không tại onCreate () để chúng không được gọi lại khi màn hình được xoay. Hóa ra tôi phải gọi Fragment.setRetainInstance (true) nếu không cả onCreate () và onCreateView () đều được gọi lại khi màn hình được xoay.
Rau chết tiệt

Trong onCreateView (), có an toàn để truy cập phân cấp xem không?
Cody

@Cody Tôi tin là như vậy - truy cập vào hệ thống phân cấp xem là mục đích chính xác của onCreateView.
Farbod Salamat-Zadeh

1
Tuy nhiên, onCreate () của hoạt động có thể chưa kết thúc cho đến khi onActivityCreated ()? Đây có phải là bất kỳ cơ hội sụp đổ trong onCreateView để truy cập phân cấp xem không? Tôi không chắc sự khác biệt giữa onCreateView () / on onActivityCreated ()
Cody

1
Một điều cần lưu ý (ít nhất là với AppCompatActivity) là khi hoạt động được tạo lại (ví dụ sau khi được thu nhỏ và tiêu diệt), các đoạn onCreate () sẽ được gọi trước khi các hoạt động onCreate () và super.onCreate () kết thúc. Đây có thể là một vấn đề nếu bạn đang sử dụng một cái gì đó như Dagger và cần truy cập một cái gì đó trong hoạt động cha mẹ được tiêm. Một giải pháp cho vấn đề này là đặt mã vào onActivityCreated () được gọi luôn là onCreate () được gọi.
Nicholas

143

Đối với bất cứ ai đang tìm kiếm một câu trả lời súc tích, bằng hình ảnh:

nhập mô tả hình ảnh ở đây https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


Và,

nhập mô tả hình ảnh ở đây


21
Đã đồng ý. Comic Sans là cần thiết cho những thứ như thế này
Kartik Chugh

1
Đây là lần đầu tiên tôi thấy 3 phông chữ khác nhau trong cùng một sơ đồ, và bằng cách nào đó, cuộc sống của tôi cảm thấy hoàn chỉnh.
Gil Sand

Khi chính xác một mảnh có thể khởi động lại?
Saurabh

1
Làm thế nào mà mảnh vỡ không được tạo lại một khi quá trình của nó đã chết? AFAIK, chỉ trạng thái nhiệm vụ được bảo tồn dưới dạng một gói và nó được tạo lại, ứng dụng được đưa trở lại nền tảng một lần nữa.
stdout

6

onActivityCreated () - Không dùng nữa

onActivityCreated()hiện không được chấp nhận là Fragment Phiên bản 1.3.0-alpha02

Phương thức onActivityCreated () hiện không được dùng nữa. Mã chạm vào khung nhìn của đoạn nên được thực hiện trong onViewCreated () (được gọi ngay trước onActivityCreated ()) và mã khởi tạo khác phải ở trong onCreate (). Để nhận được một cuộc gọi lại cụ thể khi onCreate () của hoạt động hoàn tất, LifeCyclObserver phải được đăng ký trên Vòng đời của hoạt động trong onAttach () và xóa sau khi nhận được cuộc gọi lại onCreate ().

Thông tin chi tiết có thể được tìm thấy ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.