Android基礎(chǔ)之Fragment與Activity交互詳解
今天繼續(xù)講解Fragment組件的特性,主要是跟Activity的交互和生命周期的關(guān)系,我們前面已經(jīng)說過Fragment是依賴于Activity的,而且生命周期也跟Activity綁定一起。下面我們看看Fragment跟Activity的關(guān)系。
1、為Activity創(chuàng)建事件回調(diào)方法
在一些情況下, 你可能需要一個fragment與activity分享事件。 一個好的方法是在fragment中定義一個回調(diào)的interface, 并要求宿主activity實現(xiàn)它。當(dāng)activity通過interface接收到一個回調(diào), 必要時它可以和在layout中的其他fragment分享信息。例如, 如果一個新的應(yīng)用在activity中有2個fragment – 一個用來顯示文章列表(framgent A), 另一個顯示文章內(nèi)容(fragment B) – 然后 framgent A必須告訴activity何時一個list item被選中,然后它可以告訴fragmentB去顯示文章。
在這個例子中, OnArticleSelectedListener 接口在fragment A中聲明:
public static class FragmentA extends ListFragment
{
//...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
}
//...
}
然后fragment的宿主activity實現(xiàn) OnArticleSelectedListener 接口,并覆寫 onArticleSelected() 來通知fragment B,從fragment A到來的事件。為了確保宿主activity實現(xiàn)這個接口, fragment A的 onAttach() 回調(diào)方法(當(dāng)添加fragment到activity時由系統(tǒng)調(diào)用) 通過將作為參數(shù)傳入onAttach()的Activity做類型轉(zhuǎn)換來實例化一個OnArticleSelectedListener實例。
public static class FragmentA extends ListFragment
{
OnArticleSelectedListener mListener;
//...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implementOnArticleSelectedListener");
}
}
//...
}
如果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。
public static class FragmentA extends ListFragment
{
OnArticleSelectedListener mListener;
//...
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Append the clicked item's row ID with the content provider Uri
Uri noteUri =ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
// Send the event and Uri to the host activity
mListener.onArticleSelected(noteUri);
//...
}
傳給 onListItemClick() 的 id 參數(shù)是被點擊的項的行ID,activity(或其他fragment)用來從應(yīng)用的 ContentProvider 獲取文章。
2、添加項目到ActionBar
你的fragment可以通過實現(xiàn) onCreateOptionMenu() 提供菜單項給activity的選項菜單(以此類推, Action Bar也一樣)。為了使這個方法接收調(diào)用,無論如何,你必須在 onCreate() 期間調(diào)用 setHasOptionsMenu() 來指出fragment愿意添加item到選項菜單(否則, fragment將接收不到對 onCreateOptionsMenu()的調(diào)用)。
隨后從fragment添加到Option菜單的任何項,都會被追加到現(xiàn)有菜單項的后面。當(dāng)一個菜單項被選擇,fragment也會接收到 對 onOptionsItemSelected() 的回調(diào)。也可以在你的fragment layout中通過調(diào)用registerForContextMenu() 注冊一個view來提供一個環(huán)境菜單。當(dāng)用戶打開環(huán)境菜單,fragment接收到一個對 onCreateContextMenu() 的調(diào)用.當(dāng)用戶選擇一個項目, fragment接收到一個對onContextItemSelected() 的調(diào)用。
注意: 盡管你的fragment會接收到它所添加的每一個菜單項被選擇后的回調(diào),但實際上當(dāng)用戶選擇一個菜單項時,activity會首先接收到對應(yīng)的回調(diào)。如果activity的on-item-selected回調(diào)函數(shù)實現(xiàn)并沒有處理被選中的項目,然后事件才會被傳遞到fragment的回調(diào)。
這個規(guī)則適用于選項菜單和環(huán)境菜單。
3、處理fragment的生命周期
管理fragment的生命周期, 大多數(shù)地方和管理activity生命周期很像.和activity一樣, fragment可以處于3種狀態(tài):
Resumed
在運行中的activity中fragment可見。
Paused
另一個activity處于前臺并擁有焦點,但是這個fragment所在的activity仍然可見(前臺activity局部透明或者沒有覆蓋整個屏幕)。
Stopped
要么是宿主activity已經(jīng)被停止, 要么是fragment從activity被移除但被添加到后臺堆棧中。
停止?fàn)顟B(tài)的fragment仍然活著(所有狀態(tài)和成員信息被系統(tǒng)保持著)。然而,它對用戶不再可見,并且如果activity被干掉,他也會被干掉。
其對應(yīng)關(guān)系圖如下:
和activity一樣, 你可以使用Bundle保持fragment的狀態(tài),萬一activity的進程被干掉,并且當(dāng)activity被重新創(chuàng)建的時候, 你需要恢復(fù)fragment的狀態(tài)時就可以用到. 你可以在fragment的 onSaveInstanceState() 期間保存狀態(tài),并可以在 onCreate(),onCreateView() 或 onActivityCreated() 期間恢復(fù)它。
生命周期方面activity和fragment之間最重要的區(qū)別是各自如何在它的后臺堆棧中儲存。 在默認情況下,activity在停止后,它會被放到一個由系統(tǒng)管理的用于保存activity的后臺堆棧。(因此用戶可以使用BACK按鍵導(dǎo)航回退到它)。
然而,僅當(dāng)你在一個事務(wù)期間移除fragment時,顯式調(diào)用addToBackStack()請求保存實例時,才被放到一個由宿主activity管理的后臺堆棧。
另外,管理fragment的生命周期和管理activity生命周期非常類似。因此, "managing the activitylifecycle"中的相同實踐也同樣適用于fragment。你需要理解的是,activity的生命如何影響fragment的生命。
4、與activity生命周期的協(xié)調(diào)工作
fragment所生存的activity的生命周期,直接影響fragment的生命周期,每一個activity的生命周期的回調(diào)行為都會引起每一個fragment中類似的回調(diào)。
例如,當(dāng)activity接收到onPause()時,activity中的每一個fragment都會接收到onPause()。
Fragment 有一些額外的生命周期回調(diào)方法,那些是處理與activity的唯一的交互,為了執(zhí)行例如創(chuàng)建和銷毀fragment的UI的動作。這些額外的回調(diào)方法是:
•onAttach()
當(dāng)fragment被綁定到activity時被調(diào)用(Activity會被傳入)
•onCreateView()
創(chuàng)建和fragment關(guān)聯(lián)的view hierarchy時調(diào)用
•onActivityCreated()
當(dāng)activity的onCreate()方法返回時被調(diào)用
•onDestroyView()
當(dāng)和fragment關(guān)聯(lián)的view hierarchy正在被移除時調(diào)用
•onDetach()
當(dāng)fragment從activity解除關(guān)聯(lián)時被調(diào)用
fragment生命周期的流程,以及宿主activity對它的影響,在圖3中顯示。在這個圖中,可以看到activity依次的每個狀態(tài)是如何決定fragment可能接收到的回調(diào)方法。例如,當(dāng)activity接收到它的onCreate(),activity中的fragment接收到最多是onActivityCreated()。
一旦activity到達了resumed狀態(tài),你可以自由地在activity添加和移除fragment。因此,僅當(dāng)activity處于resumed狀態(tài)時, fragment的生命周期才可以獨立變化。
無論如何,當(dāng)activity離開resumed狀態(tài),fragment再次被activity的推入它自己的生命周期過程。
5、總結(jié)
Fragment的相關(guān)知識暫時就講到這里,例子Demo可以直接看APIDEMO里面的程序,如果不知道API Demo在哪里,請百度!學(xué)編程需要自己學(xué)會找答案。
- Android基礎(chǔ)之使用Fragment控制切換多個頁面
- Android中fragment嵌套fragment問題解決方法
- Android程序開發(fā)之Fragment實現(xiàn)底部導(dǎo)航欄實例代碼
- Android的Fragment的生命周期各狀態(tài)和回調(diào)函數(shù)使用
- Android Fragment 基本了解(圖文介紹)
- Android fragment實現(xiàn)多個頁面切換效果
- Android 管理Activity中的fragments
- Fragment里添加ListView不要用ListFragment
- FrameLayout和Fragment處理Android應(yīng)用UI布局實例
- 安卓開發(fā)之FragmentPagerAdapter和FragmentStatePagerAdapter詳解
相關(guān)文章
Android編程實現(xiàn)Listview點擊展開和隱藏的方法
這篇文章主要介紹了Android編程實現(xiàn)Listview點擊展開和隱藏的方法,涉及Android中Listview的響應(yīng)點擊與樣式變換相關(guān)操作技巧,需要的朋友可以參考下2015-12-12Android TabWidget切換卡的實現(xiàn)應(yīng)用
本篇文章小編為大家介紹,Android TabWidget切換卡的實現(xiàn)應(yīng)用。需要的朋友參考下2013-04-04Android BroadcastReceiver廣播機制概述
這篇文章主要為大家詳細介紹了Android BroadcastReceiver廣播機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08詳解Android Material Design自定義動畫的編寫
這篇文章主要介紹了詳解Android Material Design自定義動畫的編寫,其中對Activity的過渡動畫進行了重點講解,需要的朋友可以參考下2016-04-04