2011-06-22 36 views
39

Tôi đã có một ứng dụng sử dụng phân đoạn và tôi đang chơi xung quanh với cách sử dụng cùng một đoạn trong một Hoạt động với ngăn kép và Hoạt động như một mình. Vẫn không chắc chắn về phương pháp tốt nhất để hoàn thành điều này nhưng tôi nhận thấy FragmentManager có một hàm putFragment và getFragment. Điều làm tôi bối rối là bạn phải cung cấp một tham số Bundle cho cả hai hàm get và put. Làm cách nào để tách các hoạt động có cùng một gói? Rõ ràng bạn có thể vượt qua các Bundle như một tham số nhưng tại thời điểm đó tôi cảm thấy như bạn chỉ cần làm một mớ hỗn độn của sự vật.Khi nào sử dụng FragmentManager :: putFragment và getFragment

Vậy kịch bản tốt cho việc sử dụng getFragment và putFragment là gì? Vui lòng bao gồm giải thích tham số Bundle.

+1

Tôi biết rằng 'putFragment' sẽ được sử dụng kết hợp với' onSaveInstanceState' để duy trì một tham chiếu đến đoạn nếu hoạt động này bị phá hủy trên nói một sự thay đổi định hướng hoặc nếu hệ điều hành cần phải đòi lại bộ nhớ, với mảnh được lấy ra trong nói 'onCreate (...)'.Điều cần biết là ví dụ về thời điểm bạn có thể muốn duy trì tham chiếu. Tôi vừa hoàn thành một dự án cảng mảnh mà tôi chưa bao giờ làm điều này, mặc dù có lẽ tôi nên có. – PJL

+0

Tôi đã có bố cục ngăn kép cho cả cảnh quan và chân dung mà các hoạt động được tạo lại trên thay đổi hướng. Về những thay đổi định hướng, các mảnh của tôi được tái tạo và nạp vào các thùng chứa của chúng, như đã đề cập ở trên, tôi không tìm thấy nhu cầu sử dụng 'put | getFragment' để bất kỳ ví dụ hay về thời điểm sử dụng sẽ tốt. – PJL

+1

Kiến trúc vô cùng ngu ngốc của android đang giết chết tôi ... – syloc

Trả lời

59

Câu trả lời cơ bản:.

Chúng chỉ hữu ích khi triển khai onSaveInstanceState() và khôi phục trạng thái đó trong onCreate(). Nếu bạn không thực hiện onSaveInstanceState(), bạn có thể quên các phương thức này và giả vờ như chúng không tồn tại.

Sự cố mà họ đang giải quyết: nếu bạn muốn lưu tham chiếu đến một đoạn trong "trạng thái mẫu đã lưu", bạn không thể chỉ đặt tham chiếu đối tượng vào đó. Đầu tiên, vì bạn không thể đặt đối tượng đơn giản trong một Bundle. :) Và lý do cho điều này là điểm của trạng thái đã lưu đó là để nó được sao chép ra khỏi quá trình của bạn, vì vậy nếu quá trình của bạn cần phải bị giết, sau này nó có thể được sao chép lại vào một quy trình mới để bạn - khởi tạo hoạt động/đoạn của bạn từ. Một đối tượng thô chỉ có ý nghĩa trong bối cảnh của quá trình đang chạy, vì vậy không thể sao chép chính xác tham chiếu đến một đối tượng như vậy trong quá trình hiện tại của bạn và sang một đối tượng khác. Vì vậy, những gì putFragment()/getFragment() làm là đặt một đoạn dữ liệu trong Bundle đã cho, có thể xác định phân đoạn đó qua một thể hiện mới của hoạt động/đoạn của bạn trong một tiến trình khác. Chính xác những gì đại diện này là, không được xác định, nhưng trong thực hiện hiện tại nó là định danh số nguyên nội bộ cho đoạn đó, sẽ được sử dụng sau này khi FragmentManager cần tái tạo phân đoạn đó từ trạng thái đã lưu trước đó ... được tạo lại với cùng một định danh đó, vì vậy khi bạn gọi getFragment() nó có thể lấy ra số nguyên, và sử dụng nó để xác định đối tượng Fragment chính xác để quay trở lại người gọi tương ứng với người đã lưu trước đó.

+0

Điều đó tạo ra rất nhiều ý nghĩa. Cảm ơn hackbod – Spidy

+0

Một lần nữa cảm ơn. Xin lỗi về kỳ nghỉ nên không thể tự thưởng cho mình tiền thưởng. – PJL

+6

Điều này có thể không được thực hiện bởi getFragmentManager(). FindFragmentByTag() mỗi lần trong onCreate? – Enigma

1

Bạn có một giải thích tốt đẹp về những gì put|getFragment có thể được sử dụng cho trong android group thread này.

Mặc dù toàn bộ chủ đề thú vị, câu trả lời thực sự cho câu hỏi của bạn đã được đưa ra bởi Dianne Hackborn"

Bạn cũng có thể tận dụng lợi thế của FragmentManager API để tiết kiệm một đoạn 'con trỏ' trong một bó và sau đó lấy nó, để cho phép bạn duy trì con trỏ trực tiếp trên khắp tiểu bang tiết kiệm/khôi phục

+1

Cảm ơn bạn đã tham khảo. Tôi vẫn còn phần nào không chắc chắn đã đọc này là khi tôi tốt nhất có thể sử dụng các phương pháp này (nó có thể là tôi chỉ không nhận được nó). Tôi đã sử dụng các phương pháp để lấy các mảnh bằng thẻ và đã sử dụng một trình lắng nghe ... Thật đáng tiếc là mẫu trình diễn api không bao gồm việc sử dụng các phương thức này. – PJL

+1

@PJL: Bạn đã từng sử dụng 'onSaveInstanceState' chưa? Đây là câu trả lời tuyệt vời về nó từ Reto Meier: http://stackoverflow.com/questions/151777/how-do-i-save-an-android-applications-state 'put | getFragment', như Dianne đã đề cập, sẽ được sử dụng chính xác cho điều đó nhưng khi giao dịch với 'Fragments'. – Macarse

+0

Cảm ơn bạn đã liên kết. Tôi sử dụng 'onSaveInstanceState', tức là đối với danh sách mảnh ngăn bên trái của ngăn kép, tôi sử dụng nó để lưu vị trí hiện đang được chọn (theo FragmentLayout), tuy nhiên, tôi không cần phải giao tiếp với đoạn bên tay phải. – PJL

17

Tóm lại, đó chỉ là cách bạn có thể truy xuất tham chiếu của đoạn sau Activity được khôi phục. Ví dụ, khi bạn tạo một đoạn và sử dụng nó trong suốt hoạt động của bạn, vì vậy sau khi thay đổi cấu hình, hoạt động của bạn được tạo lại, bạn muốn tham chiếu đó trở lại. Vì vậy,

public void onSaveInstanceState(Bundle outState){ 
    getFragmentManager().putFragment(outState,"myfragment",myfragment); 
} 
public void onRetoreInstanceState(Bundle inState){ 
    myFragment = getFragmentManager().getFragment(inState,"myfragment"); 
} 
+6

đừng quên những cuộc gọi siêu đó –

+2

Chúng ta không thể lấy tham chiếu phân đoạn đó từ FragmentManager? Nếu có, thì tại sao tôi nên đặt nó vào saveInstanceState? – azizbekian

Các vấn đề liên quan