2012-06-22 27 views
55

Tôi tìm thấy Fragment # setRetainInstance (true) gây nhầm lẫn. Đây là Javadoc, chiết xuất từ ​​các Android Developer API:Tại sao lại sử dụng Fragment # setRetainInstance (boolean)?

public void setRetainInstance (boolean giữ lại)

kiểm soát xem một instance đoạn được giữ lại trên Hoạt động tái tạo (chẳng hạn như từ một sự thay đổi cấu hình). Điều này chỉ có thể được sử dụng với các mảnh không nằm trong ngăn xếp phía sau. Nếu đặt, vòng đời fragment sẽ hơi khác nhau khi một hoạt động được tái tạo:

  • onDestroy() sẽ không được gọi là (nhưng onDetach() vẫn sẽ được, vì các đoạn đã được tách ra khỏi hoạt động hiện tại của nó).
  • onCreate (Bundle) sẽ không được gọi vì đoạn không được tạo lại.
  • onAttach (Hoạt động) và onActivityCreated (Bundle) sẽ vẫn được gọi.

Câu hỏi: Làm thế nào để bạn như là một nhà phát triển sử dụng này, và tại sao nó làm cho mọi việc dễ dàng hơn?

+3

câu hỏi tương tự với thông tin tốt: [Hiểu về thiết lập của Fragment setRetainInstance (boolean)] (http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) –

+1

'onDestroy()' sẽ được gọi nếu thiết bị thấp trên bộ nhớ –

Trả lời

72

Làm thế nào để bạn như là một nhà phát triển này sử dụng

Gọi setRetainInstance(true). Tôi thường làm điều đó trong onCreateView() hoặc onActivityCreated(), nơi tôi sử dụng nó.

và tại sao mọi thứ trở nên dễ dàng hơn?

Nó có xu hướng đơn giản hơn onRetainNonConfigurationInstance() để xử lý lưu giữ dữ liệu trên các thay đổi cấu hình (ví dụ: xoay thiết bị từ dọc sang ngang). Các mảnh không được giữ lại bị phá hủy và được tái tạo trên sự thay đổi cấu hình; các mảnh còn lại thì không. Do đó, bất kỳ dữ liệu nào được lưu giữ bởi các đoạn còn lại đó đều có sẵn cho hoạt động thay đổi cấu hình sau.

+0

@CommonsWare - Nếu bạn tạo một đoạn mới trong một Hoạt động và Hoạt động đó được tạo lại, làm cách nào để tránh tạo lại một đoạn mới? – Neil

+4

@Neil: Xem liệu phân đoạn có tồn tại hay không (ví dụ: 'findFragmentById()'). Không tạo lại nó nếu nó tồn tại. – CommonsWare

+0

@CommonsWare Nếu phân đoạn hơi nặng nề với chế độ xem và sử dụng bộ nhớ, bạn nghĩ nhà phát triển giỏi nên làm gì? –

41

Sẽ rất hữu ích trong việc duy trì các tài nguyên đang chạy dài, chẳng hạn như ổ cắm. Có một đoạn UI-less chứa tham chiếu đến ổ cắm bluetooth và bạn sẽ không phải lo lắng về việc kết nối lại chúng khi người dùng lật điện thoại.

Cũng tiện dụng trong việc giữ tham chiếu đến tài nguyên mất nhiều thời gian để tải như bitmap hoặc dữ liệu máy chủ. Tải nó một lần, giữ nó trong một đoạn được giữ lại, và khi hoạt động được tải lại nó vẫn còn đó và bạn không phải xây dựng lại nó.

+0

Mẹo hay không, cảm ơn bạn. –

+0

đó là một điểm tuyệt vời. – StackOverflowed

+0

Đẹp.Nhưng nếu chúng ta cần làm mới chúng thì sao? –

26

Đã thêm câu trả lời này rất muộn, nhưng tôi nghĩ nó sẽ làm cho mọi việc rõ ràng hơn. Nói sau tôi. Khi setRetainInstance là:

FALSE

  • Fragment được tái tạo về biến đổi cấu hình. INSTANCE MỚI được tạo.
  • TẤT CẢ các phương thức vòng đời được gọi là thay đổi cấu hình, bao gồm cả onCreate() và onDestroy().

TRUE

  • Fragment không được tái tạo về biến đổi cấu hình. SAME INSTANCE được sử dụng.
  • Tất cả các phương pháp vòng đời được gọi là thay đổi cấu hình, APART FROM onCreate() và onDestroy().
  • Giữ lại một thể hiện sẽ không hoạt động khi được thêm vào hậu trường.

Đừng quên rằng những điều trên áp dụng cho DialogFragments cũng như Fragments.

+1

bạn có thể thêm tham chiếu đến 'Giữ lại một cá thể sẽ không hoạt động khi được thêm vào backstack hay không. ? ' – nmxprime

+1

@nmxprime tại đây: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance (boolean) –

+1

Làm cách nào để khôi phục trạng thái của phân đoạn trong trường hợp nó được thêm vào ngăn xếp ngược? savedInstanceState là null và tôi không thể sử dụng setRetainInstance ... –

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