9

Hướng dẫn dành cho nhà phát triển Android khuyên tôi nên sử dụng các hoạt động lưu trữ của các đoạn để truyền dữ liệu và không có điều gì, vậy tại sao lại có phương pháp phân đoạn/lấy mục tiêu?Chúng ta có nên sử dụng setTargetFragment() không? Tôi nghĩ Fragments không nên giao tiếp với nhau

Ứng dụng của tôi cho đến nay chứa hoạt động của máy chủ và một đoạn, có nút khởi chạy DialogFragment, trong đó có nút khởi chạy ANOTHER DialogFragment. Sử dụng setTargetFragment/getTargetFragment đã thực hiện toàn bộ thử thách này một chút khó hiểu mặc dù, vì vậy tôi đang suy nghĩ về reimplementing để cho hoạt động chính của tôi xử lý các phương thức DialogFragment.show thông qua giao diện tùy chỉnh của phân đoạn chính của tôi.

Đây có phải là cách suy nghĩ đúng đắn không? Hoặc không có hại trong việc sử dụng setTargetFragment? Bất cứ ai có thể cung cấp ví dụ tốt và xấu của việc sử dụng nó?

Trả lời

5

Tôi không nghĩ rằng có tác hại tiềm ẩn trong việc sử dụng setTargetFragment, tuy nhiên, tôi sẽ chỉ sử dụng nó trong các trường hợp rất cụ thể. Ví dụ, nếu đoạn đích chỉ là , chỉ sẽ được sử dụng bởi phân đoạn (có tính đến việc tái sử dụng đối tượng tài khoản và thiết kế các lớp của bạn để có thể tái sử dụng khi có thể) và thậm chí sau đó, một cách tiết kiệm.

Bằng cách sử dụng chúng quá nhiều, bạn sẽ kết thúc với những gì bạn đang thấy - gây nhầm lẫn mã khó theo dõi và duy trì. Ngay từ đầu, bằng cách marshaling mọi thứ thông qua hoạt động của bạn, bạn duy trì một hệ thống phân cấp "phẳng" đơn giản để theo dõi và duy trì.

Tôi nghĩ rằng quyết định sử dụng setTargetFragment hay không là một kiểu mã hóa/triết học, với sự khôn ngoan và kinh nghiệm, nó "cảm thấy" đúng hay sai. Có thể trong trường hợp của bạn, bằng chứng rằng bạn đang hỏi mã cũ của mình, bạn đang đạt được sự khôn ngoan đó :)

+0

Tôi cho rằng ruột của tôi đã cho tôi biết đúng. Cảm ơn những lời đề nghị. Tôi sẽ bắt đầu reimplementing ngay bây giờ ...: P –

+1

Nếu bạn sử dụng setTargetFragment thông qua giao diện gọi lại, bạn sẽ không ghép mảnh với nhau - tuy nhiên nếu bạn cast vào một Fragment cụ thể, thì tôi sẽ xem xét một ý tưởng tồi vì nó giới thiệu chặt chẽ khớp nối. – AgentKnopf

6

Ngoài ra, bạn có thể kết thúc với ngoại lệ không tìm thấy đoạn đích nào trong trình quản lý phân mảnh. Điều này xảy ra nếu sau khi xoay vòng (hoặc thay đổi cấu hình khác) đoạn đích của bạn sẽ không được readded để quản lý fragment bởi thời gian khi mảnh người gọi sẽ được thêm vào.

Hãy tưởng tượng bạn có một số loại mảnh Chứng nhận mà bạn thêm từ MainFragment như vậy:

ConfirmationFragment frag = new ConfirmationFragment(); 
frag.setTargetFragment(this, 0); 
getFragmentManager().beginFragmentTransaction().add(R.id.container, frag).commit(); 

Bây giờ trên một số nút xác nhận nhấp chuột, bạn gọi một phương thức từ MainFragment bằng cách gọi:

((MainFragment)this.getTargetFragment()).onUserSelectedGoodButton(); 

này khá đơn giản nhưng nếu bạn xoay màn hình và vì lý do nào đó, ConfirmationFragment sẽ được thêm vào FragmentManager trước MainFragment, ngoại lệ sẽ được ném, chỉ số không tìm thấy đoạn đích đó trong trình quản lý phân đoạn

+0

Tất cả những gì bạn phải làm là lưu đoạn đích của bạn trong onSaveInstanceState - sau đó bạn có thể truy xuất nó trong onCreate nếu savedInstance là! = Null. Tôi yếu ớt nhớ đã đọc, rằng nếu bạn thay thế một mảnh nó có thể là vấn đề, thay vì ẩn bản gốc và thêm mảnh mới trên đầu trang của nó. – AgentKnopf