轉載請標明出處:
http://blog.csdn.net/a940659387/article/details/50730076;
原文:http://emuneee.com/blog/2013/01/07/saving-fragment-states/
在Android 3.0(SDK 11)以後,Android 出現了一個偉大的功能:如何在你的App中保存和還原你的Framgent數據。
它是什麼
我再我下一個App開發中期的時候參考Android API時,偶然發現 FragmentManager.putFragment(Bundle, String, Fragment) and FragmentManager.getFragment(Bundle, String) 這兩個方法。它們的作用?
putFragment
將一個Fragment的引用傳遞到Bundle中。這個Bundle可以一直保存它的數據,以後通過調用
getFragment(Bundle, String)方法得到一個一樣的Fragmet 實例。
getFragment
取回一個先前通過 putFragment(Bundle, String, Fragment).方法存儲的fragment實例。
根據我的理解,當你把當前的Fragment放置到bundle中,他會保存一個的指針指向這個fragment的地址;當你調用getFragment()方法時,它將返回你通過putFragment保存的指針對應的Fragment實例。
你也可以通過使用FramgentManager APIs 去保存一個fragment 對應的指針(我感覺叫引用更好) 到bundle中 在以後用到時取出。它也允許你實現這個指針的存儲跟取出(還原)。
---Diane Hackborn ,Android 架構師。 [Source](https://groups.google.com/forum/?fromgroups=#!topic/android-developers/NBlMJnMaGbo)
如何去使用它
一個使用這個API的方法是在我的這個Acticity的創建和銷燬的時候。自fragment出現以來,我通常用兩個Activity來使用它,一個是我的activity,另一個用來設置Fragment。我再我的activity中管理fragment.
putFragment
在activity的 onSaveInstanceState 像這樣使用:
@Override
protected void onSaveInstanceState(Bundle outState) {
FragmentManager manager = getFragmentManager();
manager.putFragment(outState, MyFragment.TAG, mMyFragment);
}
MyFragment 是一個在我應用中創建的Fragment,這個bundle,outState,只是一個簡單的bunlde,它將存儲你fragment(即MyFragment)對應的引用(指針)。 MyFragment.TAG 是你的fragment指針以後會用到的key值。
GetFragment
我有一個自定義方法(instantiateFragments) ,它會做一到兩件事情:當我的應用是冷啓動時抓取我的fragment實例 或者 獲得現在的MyFragment內容。
private void instantiateFragments(Bundle inState) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
if (inState != null) {
mMyFragment = (MyFragment) manager.getFragment(inState, MyFragment.TAG);
} else {
mMyFragment = new MyFragment();
transaction.add(R.id.fragment, mMyFragment, MyFragment.TAG);
transaction.commit();
}
}
我在我的activity中調用instantiateFragments 這個方法,onRestoreInstanceState傳入的參數爲null時(onCreate 方法通過冷啓動觸發),當通過熱啓動觸發時,傳入的參數爲bundle.
@Override
protected void onRestoreInstanceState(Bundle inState) {
instantiateFragments(inState);
}
當用戶旋轉設備時,Android 將銷燬Activity,並在銷燬前觸發onSaveInstanceState,允許開發者來
保存數據。一旦activity被重新啓動,這個OS 將觸發onRestoreInstanceState 恢復開發者旋轉前的保存的狀態。
我鼓勵你繼續更深調查Android框架。因爲所有類型都有細微的差別,他們將簡化Android應用程序開發工作。