android之Fragment(官网资料翻译)三
?
與Activity通信
盡管Fragment被實現(xiàn)為一個獨立于Activity的對象,并且可以在多個activity中使用,但一個給定的fragment實例是直接綁定到包含它的activity的. 特別的,fragment可以使用 getActivity() 訪問Activity實例, 并且容易地執(zhí)行比如在activity layout中查找一個view的任務
?同樣地,activity可以通過從FragmentManager獲得一個到Fragment的引用來調(diào)用fragment中的方法, 使用findFragmentById() 或 findFragmentByTag().
為Activity創(chuàng)建事件回調(diào)方法
?
在一些情況下, 你可能需要一個fragment與activity分享事件. 一個好的方法是在fragment中定義一個回調(diào)的interface, 并要求宿主activity實現(xiàn)它.當activity通過interface接收到一個回調(diào), 必要時它可以和在layout中的其他fragment分享信息.
例如, 如果一個新的應用在activity中有2個fragment – 一個用來顯示文章列表(framgent A), 另一個顯示文章內(nèi)容(fragment B) – 然后 framgent A必須告訴activity何時一個list item被選中,然后它可以告訴fragmentB去顯示文章.
在這個例子中, OnArticleSelectedListener 接口在fragment A中聲明:
然后fragment的宿主activity實現(xiàn) OnArticleSelectedListener 接口, 并覆寫 onArticleSelected() 來通知fragment B,從fragment A到來的事件.為了確保宿主activity實現(xiàn)這個接口, fragment A的 onAttach() 回調(diào)方法(當添加fragment到activity時由系統(tǒng)調(diào)用) 通過將作為參數(shù)傳入onAttach()的Activity做類型轉(zhuǎn)換來實例化一個OnArticleSelectedListener實例.
如果activity沒有實現(xiàn)接口, fragment會拋出 ClassCastException 異常. 正常情形下,mListener成員會保持一個到activity的OnArticleSelectedListener實現(xiàn)的引用, 因此fragment A可以通過調(diào)用在OnArticleSelectedListener接口中定義的方法分享事件給activity.例如, 如果fragment A是一個 ListFragment的子類, 每次用戶點擊一個列表項, 系統(tǒng)調(diào)用在fragment中的onListItemClick(),然后后者調(diào)用 onArticleSelected() 來分配事件給activity.
?傳給 onListItemClick() 的 id 參數(shù)是被點擊的項的行ID, activity(或其他fragment)用來從應用的 ContentProvider 獲取文章.
添加項目到ActionBar
你的fragment可以通過實現(xiàn) onCreateOptionMenu() 提供菜單項給activity的選項菜單(以此類推, Action Bar也一樣).為了使這個方法接收調(diào)用,無論如何, 你必須在 onCreate() 期間調(diào)用 setHasOptionsMenu() 來指出fragment愿意添加item到選項菜單(否則, fragment將接收不到對 onCreateOptionsMenu()的調(diào)用).
隨后從fragment添加到Option菜單的任何項,都會被追加到現(xiàn)有菜單項的后面.當一個菜單項被選擇, fragment也會接收到 對 onOptionsItemSelected() 的回調(diào).也可以在你的fragment layout中通過調(diào)用registerForContextMenu() 注冊一個view來提供一個環(huán)境菜單.當用戶打開環(huán)境菜單, fragment接收到一個對 onCreateContextMenu() 的調(diào)用.當用戶選擇一個項目, fragment接收到一個對onContextItemSelected() 的調(diào)用.
注意: 盡管你的fragment會接收到它所添加的每一個菜單項被選擇后的回調(diào), 但實際上當用戶選擇一個菜單項時, activity會首先接收到對應的回調(diào).如果activity的on-item-selected回調(diào)函數(shù)實現(xiàn)并沒有處理被選中的項目, 然后事件才會被傳遞到fragment的回調(diào).
這個規(guī)則適用于選項菜單和環(huán)境菜單.
處理fragment的生命周期
管理fragment的生命周期, 大多數(shù)地方和管理activity生命周期很像.和activity一樣, fragment可以處于3種狀態(tài):
Resumed
在運行中的activity中fragment可見.
Paused
另一個activity處于前臺并擁有焦點, 但是這個fragment所在的activity仍然可見(前臺activity局部透明或者沒有覆蓋整 個屏幕).
Stopped
要么是宿主activity已經(jīng)被停止, 要么是fragment從activity被移除但被添加到后臺堆棧中.
停止狀態(tài)的fragment仍然活著(所有狀態(tài)和成員信息被系統(tǒng)保持著). 然而, 它對用戶不再可見, 并且如果activity被干掉, 他也會被干掉.
其對應關系圖如下:
?
和activity一樣, 你可以使用Bundle保持fragment的狀態(tài), 萬一activity的進程被干掉,并且當activity被重新創(chuàng)建的時候, 你需要恢復fragment的狀態(tài)時就可以用到. 你可以在fragment的 onSaveInstanceState() 期間保存狀態(tài), 并可以在 onCreate(), onCreateView() 或 onActivityCreated() 期間恢復它.
生命周期方面activity和fragment之間最重要的區(qū)別是各自如何在它的后臺堆棧中儲存. 在默認情況下, activity在停止后, 它會被放到一個由系統(tǒng)管理的用于保存activity的后臺堆棧.(因此用戶可以使用BACK按鍵導航回退到它).
然而, 僅當你在一個事務期間移除fragment時,顯式調(diào)用addToBackStack()請求保存實例時,才被放到一個由宿主activity管理的后臺堆棧.
另外, 管理fragment的生命周期和管理activity生命周期非常類似.因此, "managing the activitylifecycle"中的相同實踐也同樣適用于fragment. 你需要理解的是, activity的生命如何影響fragment的生命.
與activity生命周期的協(xié)調(diào)工作
fragment所生存的activity的生命周期,直接影響fragment的生命周期,每一個activity的生命周期的回調(diào)行為都會引起每一個fragment中類似的回調(diào).
例如,當activity接收到onPause()時,activity中的每一個fragment都會接收到onPause().
Fragment 有一些額外的生命周期回調(diào)方法, 那些是處理與activity的唯一的交互,為了執(zhí)行例如創(chuàng)建和銷毀fragment的UI的動作. 這些額外的回調(diào)方法是:
- onAttach()
當fragment被綁定到activity時被調(diào)用(Activity會被傳入.). - onCreateView()
創(chuàng)建和fragment關聯(lián)的view hierarchy時調(diào)用. - onActivityCreated()
當activity的onCreate()方法返回時被調(diào)用. - onDestroyView()
當和fragment關聯(lián)的view hierarchy正在被移除時調(diào)用. - onDetach()
當fragment從activity解除關聯(lián)時被調(diào)用.
fragment生命周期的流程, 以及宿主activity對它的影響,在圖3中顯示.在這個圖中,可以看到activity依次的每個狀態(tài)是如何決定fragment可能接收到的回調(diào)方法.例如, 當activity接收到它的onCreate(),activity中的fragment接收到最多是onActivityCreated().
一旦activity到達了resumed狀態(tài), 你可以自由地在activity添加和移除fragment.因此,僅當activity處于resumed狀態(tài)時, fragment的生命周期才可以獨立變化.
無論如何, 當activity離開resumed狀態(tài),fragment再次被activity的推入它自己的生命周期過程.
?
轉(zhuǎn)載于:https://blog.51cto.com/whatandroid/1141676
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的android之Fragment(官网资料翻译)三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站价格的差异
- 下一篇: mysql left join 结果怎么