2012-06-22 36 views
55

我發現Fragment#setRetainInstance(true)令人困惑。這裏是的Javadoc,從Android Developer API提取:爲什麼使用Fragment#setRetainInstance(boolean)?

公共無效setRetainInstance(布爾保留)

控制片段實例是否跨過活動重新創建保留(例如從配置改變)。這隻能用於不在後端堆棧中的碎片。如果設置,當活動被重建的片段生命週期會略有不同:

  • 的onDestroy()不會被調用(但onDetach()仍然是,因爲該片段將被從其當前活動分開)。
  • 由於片段未被重新創建,因此onCreate(Bundle)將不會被調用。
  • onAttach(Activity)and onActivityCreated(Bundle)將會調用

問:你如何作爲開發者利用這一點,爲什麼它使事情變得更容易?

+3

與良好的信息相似的問題:[理解片段的setRetainInstance(布爾)](http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) –

+1

'onDestroy()'將被稱爲如果設備是低在內存上 –

回答

72

你如何爲開發者使用這個

呼叫setRetainInstance(true)。我通常在onCreateView()onActivityCreated()這樣做,我使用它。

爲什麼它使事情變得更簡單?

它通常比onRetainNonConfigurationInstance()更簡單,用於處理配置更改(例如,將設備從縱向旋轉到橫向)的數據保留。非保留片段在配置更改時被銷燬並重新創建;保留的片段不是。因此,這些保留片段所擁有的任何數據都可用於配置後更改活動。

+0

@CommonsWare - 如果您在一個Activity中創建了一個新的片段,並且該Activity被重新創建,那麼如何避免再次創建一個新片段? – Neil

+4

@Neil:查看片段是否存在(例如'findFragmentById()')。如果存在,不要重新創建它。 – CommonsWare

+0

@CommonsWare如果這個片段有很大的視圖和內存使用量,你認爲一個好的開發者應該怎麼做? –

41

這對保持長時間運行的資源(如套接字)非常有幫助。有一個無UI的片段可以保存對藍牙套接字的引用,當用戶翻轉手機時,您不必擔心重新連接它們。

它也很方便地保持對像位圖或服務器數據一樣需要很長時間加載的資源的引用。加載一次,將它保存在一個保留的片段中,當活動重新加載時,它仍然存在,您不必重新構建它。

+0

優秀的提示,謝謝。 –

+0

這是一個很好的觀點。 – StackOverflowed

+0

不錯。但是如果我們需要刷新它們呢? –

26

非常晚的時候添加了這個答案,但我認爲這會讓事情更清楚。跟我說。當setRetainInstance是:

FALSE

  • 片段大幹快上的配置變化重新創建。 NEW INSTANCE已創建。
  • 所有的生命週期方法都在配置更改上調用,包括onCreate()和onDestroy()。

TRUE

  • 片段不得到改變的配置重新創建。使用SAME INSTANCE。
  • 所有生命週期方法都在config change,APART FROM onCreate()和onDestroy()上調用。
  • 將實例保留添加到堆棧後將不起作用。

不要忘記,上面的內容適用於DialogFragments和Fragments。

+1

你可以添加引用嗎?保留一個實例在添加到堆棧後將不起作用。 ' – nmxprime

+1

@nmxprime here:http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) –

+1

如何將碎片狀態添加到後備堆棧中的情況下恢復? savedInstanceState爲空,我不能使用setRetainInstance ... –

相關問題