android Fragments詳解四:管理fragment
要管理fragment們,需使用FragmentManager,要獲取它,需在activity中調用方法getFragmentManager()。
你可以用FragmentManager來做以上事情:
1使用方法findFragmentById()或findFragmentByTag(),獲取activity中已存在的fragment們。
2使用方法popBackStack()從activity的後退棧中彈出fragment們(這可以模擬後退鍵引發的動作)。
3用方法addOnBackStackChangedListerner()注冊一個偵聽器以監視後退棧的變化。
更多關於以上方法的信息,請參考“FragmentManager”文檔。
就像前麵章節所演示的,你還可以使用FragmentManager打開一個FragmentTransaction來執行fragment的事務,比如添加或刪除fragment。
執行Fragment的事務
在activity中使用fragment的一個偉大的好處是能跟據用戶的輸入對fragment進行添加、刪除、替換以及執行其它動作的能力。你提交的一組fragment的變化叫做一個事務。事務通過FragmentTransaction來執行。你還可以把每個事務保存在activity的後退棧中,這樣就可以讓用戶在fragment變化之間導航(跟在activity之間導航一樣)。
你可以通過FragmentManager來取得FragmentTransaction的實例,如下:
FragmentManagerfragmentManager=getFragmentManager();
FragmentTransactionfragmentTransaction=fragmentManager.beginTransaction();
一個事務是在同一時刻執行的一組動作(很像數據庫中的事務)。你可以用add(),remove(),replace()等方法構成事務,最後使用commit()方法提交事務。
在調用commint()之前,你可以用addToBackStack()把事務添加到一個後退棧中,這個後退棧屬於所在的activity。有了它,就可以在用戶按下返回鍵時,返回到fragment們執行事務之前的狀態。
如下例:演示了如何用一個fragment代替另一個fragment,同時在後退棧中保存被代替的fragment的狀態。
//Create new fragment and transaction FragmentnewFragment=newExampleFragment(); FragmentTransactiontransaction=getFragmentManager().beginTransaction(); //Replace whatever is in the fragment_container view with thisfragment, //and add the transaction to the backstack transaction.replace(R.id.fragment_container,newFragment); transaction.addToBackStack(null); //Commit the transaction transaction.commit();
解釋:newFragment代替了控件IDR.id.fragment_container所指向的ViewGroup中所含的任何fragment。然後調用addToBackStack(),此時被代替的fragment就被放入後退棧中,於是當用戶按下返回鍵時,事務發生回溯,原先的fragment又回來了。
如果你向事務添加了多個動作,比如多次調用了add(),remove()等之後又調用了addToBackStack()方法,那麼所有的在commit()之前調用的方法都被作為一個事務。當用戶按返回鍵時,所有的動作都被反向執行(事務回溯)。
事務中動作的執行順序可隨意,但要注意以下兩點:
1你必須最後調用commit()。
2如果你添加了多個fragment,那麼它們的顯示順序跟添加順序一至(後顯示的覆蓋前麵的)。
如果你在執行的事務中有刪除fragment的動作,而且沒有調用addToBackStack(),那麼當事務提交時,那些被刪除的fragment就被銷毀了。反之,那些fragment就不會被銷毀,而是處於停止狀態。當用戶返回時,它們會被恢複。
密技:對於fragment事務,你可以應用動畫。在commit()之前調用setTransition()就行。――一般銀我不告訴他哦。
但是,調用commit()後,事務並不會馬上執行。它會在activity的UI線程(其實就是主線程)中等待直到線程能執行的時候才執行(廢話)。如果必要,你可以在UI線程中調用executePendingTransactions()方法來立即執行事務。但一般不需這樣做,除非有其它線程在等待事務的執行。
警告:你隻能在activity處於可保存狀態的狀態時,比如running中,onPause()方法和onStop()方法中提交事務,否則會引發異常。這是因為fragment的狀態會丟失。如果要在可能丟失狀態的情況下提交事務,請使用commitAllowingStateLoss()。
最後更新:2017-04-02 16:48:16
上一篇:
FrameLayout.xml
下一篇:
分布式測試框架架構與思考(1)奠基
poj 1118 Lining Up【同一條直線上的點】
java 扁平化企業網站源碼模版 屏幕自適應 springmvc SSM 生成靜態化
深入下Ruby中的String
MySQL · 性能優化 · MySQL常見SQL錯誤用法
通過Knockout.js + ASP.NET Web API構建一個簡單的CRUD應用
『每日一題 2012-04-18』將真分數分解為埃及分數
[usaco]5.3.4強聯通分支,雙聯通分支 Network of Schools
Android開發學習網站集錦
容器服務--如何在阿裏雲容器服務上運行基於TensorFlow的Alexnet
openstack 命令行管理十二 - 內部網絡[instance專用]管理 (備忘)