轉(zhuǎn)譯:android之Fragment(官網(wǎng)資料翻譯)

Fragment要點

1絮缅、Fragment作為Activity界面的一部分組成出現(xiàn)

2、可以在一個Activity中同時出現(xiàn)多個Fragment,并且叁熔,一個Fragment亦可在多個Activity中使用。

3床牧、在Activity運行過程中荣回,可以添加、移除或者替換Fragment(add()戈咳、remove()心软、replace())

4、Fragment可以響應(yīng)自己的輸入事件著蛙,并且有自己的生命周期删铃,當(dāng)然,它們的生命周期直接被其所屬的宿主activity的生命周期影響踏堡。

設(shè)計哲學(xué)

Android在3.0中引入了fragments的概念猎唁,主要目的是用在大屏幕設(shè)備上--例如平板電腦上,支持更加動態(tài)和靈活的UI設(shè)計顷蟆。平板電腦的屏幕要比手機(jī)的大得多胖秒,有更多的空間來放更多的UI組件,并且這些組件之間會產(chǎn)生更多的交互慕的。Fragment允許這樣的一種設(shè)計阎肝,而不需要你親自來管理 viewhierarchy的復(fù)雜變化。 通過將activity的布局分散到fragment中肮街, 你可以在運行時修改activity的外觀风题,并在由activity管理的back stack中保存那些變化。(http://developer.android.com/guide/topics/fundamentals/fragments.html

例如, 一個新聞應(yīng)用可以在屏幕左側(cè)使用一個fragment來展示一個文章的列表沛硅,然后在屏幕右側(cè)使用另一個fragment來展示一篇文章--2個fragment并排顯示在相同的一個activity中眼刃,并且每一個fragment擁有它自己的一套生命周期回調(diào)方法,并且處理它們自己的用戶輸入事件摇肌。 因此擂红, 取代使用一個activity來選擇一篇文章而另一個activity來閱讀文章的方式,用戶可以在同一個activity中選擇一篇文章并且閱讀围小, 如圖所示:

fragment在你的應(yīng)用中應(yīng)當(dāng)是一個模塊化和可重用的組件昵骤。即,因為fragment定義了它自己的布局肯适, 以及通過使用它自己的生命周期回調(diào)方法定義了它自己的行為变秦,你可以將fragment包含到多個activity中。這點特別重要框舔, 因為這允許你將你的用戶體驗適配到不同的屏幕尺寸蹦玫。舉個例子,你可能會僅當(dāng)在屏幕尺寸足夠大時刘绣,在一個activity中包含多個fragment樱溉,并且,當(dāng)不屬于這種情況時纬凤,會啟動另一個單獨的饺窿,使用不同fragment的activity。

繼續(xù)之前那個新聞的例子 -- 當(dāng)運行在一個特別大的屏幕時(例如平板電腦)移斩,應(yīng)用可以在Activity A中嵌入2個fragment肚医。然而稚瘾,在一個正常尺寸的屏幕(例如手機(jī))上两嘴,沒有足夠的空間同時供2個fragment用, 因此陵像, Activity A會僅包含文章列表的fragment猖任,而當(dāng)用戶選擇一篇文章時你稚, 它會啟動ActivityB,它包含閱讀文章的fragment朱躺。因此刁赖,應(yīng)用可以同時支持上圖中的2種設(shè)計模式。

創(chuàng)建Fragment

要創(chuàng)建一個fragment长搀, 必須創(chuàng)建一個 Fragment 的子類 (或者繼承自一個已存在的它的子類)宇弛。 Fragment類的代碼看起來很像 Activity 。它包含了和activity類似的回調(diào)方法源请, 例如onCreate()枪芒、 onStart()彻况、onPause()以及 onStop()。事實上舅踪, 如果你準(zhǔn)備將一個現(xiàn)成的Android應(yīng)用轉(zhuǎn)換到使用fragment纽甘,可能只需簡單的將代碼從你的activity的回調(diào)方法分別移動到你的fragment的回調(diào)方法即可。

通常抽碌, 應(yīng)當(dāng)至少實現(xiàn)如下的生命周期方法:

onCreate()
當(dāng)創(chuàng)建fragment時悍赢, 系統(tǒng)調(diào)用該方法。
在實現(xiàn)代碼中货徙,應(yīng)當(dāng)初始化想要在fragment中保持的必要組件左权,當(dāng)fragment被暫停或者停止后可以恢復(fù)破婆。

onCreateView()
fragment第一次繪制它的用戶界面的時候涮总, 系統(tǒng)會調(diào)用此方法胸囱。 為了繪制fragment的UI祷舀,此方法必須返回一個iew, 這個view是你的fragment布局的根view烹笔。 如果fragment不提供UI裳扯, 可以返回null。

onPause()
用戶將要離開fragment時谤职,系統(tǒng)調(diào)用這個方法作為第一個指示(然而它不總是意味著fragment將被銷毀饰豺。) 在當(dāng)前用戶會話結(jié)束之前,通常應(yīng)當(dāng)在這里提交任何應(yīng)該持久化的變化(因為用戶有可能不會返回)允蜈。

其生命周期圖如下:

大多數(shù)應(yīng)用應(yīng)當(dāng)為每一個fragment實現(xiàn)至少這3個方法冤吨,但是還有一些其他回調(diào)方法你也應(yīng)當(dāng)用來去處理fragment生命周期的各種階段。全部的生命周期回調(diào)方法將會在后面章節(jié) Handlingthe Fragment Lifecycle 中討論饶套。

除了繼承基類 Fragment 漩蟆, 還有一些子類你可能會繼承:

DialogFragment
顯示一個浮動的對話框。
用這個類來創(chuàng)建一個對話框妓蛮,是使用在Activity類的對話框工具方法之外的一個好的選擇怠李,因為你可以將一個fragment對話框合并到activity管理的fragment back stack中,允許用戶返回到一個之前曾被摒棄的fragment蛤克。

ListFragment
顯示一個由一個adapter(例如 SimpleCursorAdapter)管理的項目的列表捺癞, 類似于ListActivity。
它提供一些方法來管理一個list view构挤, 例如 onListItemClick()回調(diào)來處理點擊事件髓介。

PreferenceFragment
顯示一個 Preference對象的層次結(jié)構(gòu)的列表, 類似于PreferenceActivity筋现。
這在為你的應(yīng)用創(chuàng)建一個"設(shè)置"activity時有用處版保。

添加一個用戶界面

fragment通常用來作為一個activity的用戶界面的一部分呜笑,并將它的layout提供給activity。為了給一個fragment提供一 個layout彻犁,你必須實現(xiàn) onCreateView()回調(diào)方法叫胁, 當(dāng)?shù)搅薴ragment繪制它自己的layout的時候,Android系統(tǒng)調(diào)用它汞幢。你的此方法的實現(xiàn)代碼必須返回一個你的fragment的layout的根view驼鹅。

**注意: **
如果你的fragment是ListFragment的子類,它的默認(rèn)實現(xiàn)是返回從onCreateView()返回一個ListView森篷,所以一般情況下不必實現(xiàn)它输钩。
從onCreateView()返回的View, 也可以從一個layout的xml資源文件中讀取并生成仲智。 為了幫助你這么做买乃, onCreateView() 提供了一個LayoutInflater 對象。

舉個例子钓辆, 這里有一個Fragment的子類剪验, 從文件 example_fragment.xml 加載了一個layout:

public static class ExampleFragment extends Fragment {    
    @Override    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,    
                             Bundle savedInstanceState) {    
        // Inflate the layout for this fragment    
        return inflater.inflate(R.layout.example_fragment, container, false);    
    }    
}

傳入onCreateView()的container參數(shù)是你的fragmentlayout將被插入的父ViewGroup(來自activity的layout) savedInstanceState 參數(shù)是一個Bundle,如果fragment是被恢復(fù)的前联,它提供關(guān)于fragment的之前的實例的數(shù)據(jù)功戚。

inflate() 方法有3個參數(shù):

1、想要加載的layout的resource ID似嗤。
2啸臀、加載的layout的父ViewGroup。
傳入container是很重要的, 目的是為了讓系統(tǒng)接受所要加載的layout的根view的layout參數(shù),由它將掛靠的父view指定烁落。
3乘粒、布爾值指示在加載期間, 展開的layout是否應(yīng)當(dāng)附著到ViewGroup (第二個參數(shù)).
(在這個例子中,指定了false伤塌,因為系統(tǒng)已經(jīng)把展開的layout插入到container –傳入true會在最后的layout中創(chuàng)建一個多余的view group灯萍。)

將fragment添加到activity
通常地, fragment為宿主activity提供UI的一部分, 被作為activity的整個viewhierarchy的一部分被嵌入. 有2種方法你可以添加一個fragment到activity layout:

在activity的layout文件中聲明fragment
在這種情況下,你可以像為View一樣, 為fragment指定layout屬性寸谜。例子是一個有2個fragment的activity的layout:

<?xml version="1.0" encoding="utf-8"?>    
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:orientation="horizontal"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent">    
    <fragment android:name="com.example.news.ArticleListFragment"    
            android:id="@+id/list"    
            android:layout_weight="1"    
            android:layout_width="0dp"    
            android:layout_height="match_parent" />    
    <fragment android:name="com.example.news.ArticleReaderFragment"    
            android:id="@+id/viewer"    
            android:layout_weight="2"    
            android:layout_width="0dp"    
            android:layout_height="match_parent" />    
</LinearLayout>

<fragment> 中的 android:name屬性指定了在layout中實例化的Fragment類竟稳。
當(dāng)系統(tǒng)創(chuàng)建這個activity layout時,它實例化每一個在layout中指定的fragment熊痴,并調(diào)用每一個上的onCreateView()方法他爸,來獲取每一個 fragment的layout。系統(tǒng)將從fragment返回的 View直接插入到<fragment>元素所在的地方果善。

注意:
每一個fragment都需要一個唯一的標(biāo)識诊笤,如果activity重啟,系統(tǒng)可以用來恢復(fù)fragment(并且你也可以用來捕獲fragment來處理事務(wù)巾陕,例如移除它讨跟。)

有3種方法來為一個fragment提供一個標(biāo)識:
1纪他、為 android:id 屬性提供一個唯一ID。
2晾匠、為 android:tag 屬性提供一個唯一字符串茶袒。
3、如果以上2個你都沒有提供凉馆,系統(tǒng)使用容器view的ID薪寓。

撰寫代碼將fragment添加到一個已存在的ViewGroup。
當(dāng)activity運行的任何時候澜共,都可以將fragment添加到activity layout向叉。只需簡單的指定一個需要放置fragment的ViewGroup。為了在你的 activity中操作fragment事務(wù)(例如添加嗦董,移除母谎,或代替一個fragment),必須使用來自FragmentTransaction 的API京革。
可以按如下方法奇唤,從你的Activity取得一個 FragmentTransaction 的實例:

FragmentManager fragmentManager =getFragmentManager();    
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction(); 

然后你可以使用 add() 方法添加一個fragment,指定要添加的fragment和要插入的view存崖。

ExampleFragment fragment = new ExampleFragment();    
fragmentTransaction.add(R.id.fragment_container,fragment);    
fragmentTransaction.commit();

add()的第一個參數(shù)是fragment要放入的ViewGroup冻记,由resource ID指定睡毒,第二個參數(shù)是需要添加的fragment来惧。一旦用FragmentTransaction做了改變,為了使改變生效演顾,必須調(diào)用commit()供搀。

添加一個無UI的fragment
之前的例子展示了對UI的支持,如何將一個fragment添加到activity钠至。然而葛虐,也可以使用fragment來為activity提供后臺行為而不用展現(xiàn)額外的UI。

要添加一個無UI的fragment棉钧,需要從activity使用 add(Fragment屿脐,String)來添加fragment (為fragment提供一個唯一的字符串"tag",而不是一個view ID)宪卿。這么做添加了fragment的诵,但因為它沒有關(guān)聯(lián)到一個activity layout中的一個view,所以不會接收到onCreateView()調(diào)用佑钾。因此不必實現(xiàn)此方法西疤。

為fragment提供一個字符串tag并不是專門針對無UI的fragment的–也可以提供字符串tag給有UI的fragment–但是如果fragment沒有UI,那么這個tag是僅有的標(biāo)識它的途徑休溶。如果隨后你想從activity獲取這個fragment代赁,需要使用 findFragmentByTag()扰她。

管理Fragment
要在activity中管理fragment,需要使用FragmentManager芭碍。 通過調(diào)用activity的getFragmentManager()取得它的實例徒役。可以通過FragmentManager做一些事情窖壕,包括:
1廉涕、使用findFragmentById()(用于在activity layout中提供一個UI的fragment)或findFragmentByTag()(適用于有或沒有UI的fragment)獲取activity中存在的fragment
2、將fragment從后臺堆棧中彈出艇拍,使用 popBackStack() (模擬用戶按下BACK 命令)狐蜕。
3、使用addOnBackStackChangeListener()注冊一個監(jiān)聽后臺堆棧變化的listener卸夕。

處理Fragment事務(wù)
關(guān)于在activity中使用fragment的很強(qiáng)的一個特性是:根據(jù)用戶的交互情況层释,對fragment進(jìn)行添加,移除快集,替換贡羔,以及執(zhí)行其他動作。提交給activity的每一套變化被稱為一個事務(wù)个初,可以使用在FragmentTransaction中的 API 處理乖寒。我們也可以保存每一個事務(wù)到一個activity管理的backstack,允許用戶經(jīng)由fragment的變化往回導(dǎo)航(類似于通過 activity往后導(dǎo)航)院溺。

從 FragmentManager 獲得一個FragmentTransaction實例 :

FragmentManager fragmentManager =getFragmentManager();    
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction(); 

每一個事務(wù)都是同時要執(zhí)行的一套變化楣嘁。可以在一個給定的事務(wù)中設(shè)置你想執(zhí)行的所有變化珍逸,使用諸如add()逐虚、remove()和replace()。然后谆膳,要給activity應(yīng)用事務(wù)叭爱,必須調(diào)用commit()。

在調(diào)用commit()之前漱病,你可能想調(diào)用addToBackStack()买雾,將事務(wù)添加到一個fragment事務(wù)的backstack。這個backstack由activity管理杨帽,并允許用戶通過按下BACK按鍵返回到前一個fragment狀態(tài)漓穿。

舉個例子,這里是如何將一個fragment替換為另一個睦尽,并在后臺堆棧中保留之前的狀態(tài):

// Create new fragment and transaction    
Fragment newFragment = newExampleFragment();    
FragmentTransaction transaction =getFragmentManager().beginTransaction();    
// Replace whatever is in thefragment_container view with this fragment,    
// and add the transaction to the backstack    
transaction.replace(R.id.fragment_container,newFragment);    
transaction.addToBackStack(null);    
// Commit the transaction    
transaction.commit();

在這個例子中器净,newFragment替換了當(dāng)前l(fā)ayout容器中的由R。id当凡。fragment_container標(biāo)識的fragment山害。通過調(diào)用addToBackStack()纠俭,replace事務(wù)被保存到backstack,因此用戶可以回退事務(wù)浪慌,并通過按下BACK按鍵帶回前一個fragment冤荆。

如果添加多個變化到事務(wù)(例如add()或remove())并調(diào)用addToBackStack(),然后在你調(diào)用commit()之前的所有應(yīng)用的變化會被作為一個單個事務(wù)添加到后臺堆棧权纤,BACK按鍵會將它們一起回退钓简。

添加變化到FragmentTransaction的順序不重要,除以下例外:必須最后調(diào)用commit()汹想。

如果添加多個fragment到同一個容器外邓,那么添加的順序決定了它們在viewhierarchy中顯示的順序。

當(dāng)執(zhí)行一個移除fragment的事務(wù)時古掏,如果沒有調(diào)用addToBackStack()损话,那么當(dāng)事務(wù)提交后,那個fragment會被銷毀槽唾,并且用戶不能導(dǎo)航回到它丧枪。有鑒于此,當(dāng)移除一個fragment時庞萍,如果調(diào)用了addToBackStack()拧烦,那么fragment會被停止,如果用戶導(dǎo)航回來钝计,它將會被恢復(fù)恋博。

提示:
對于每一個fragment事務(wù),你可以應(yīng)用一個事務(wù)動畫葵蒂,通過在提交事務(wù)之前調(diào)用setTransition()實現(xiàn)交播。

調(diào)用commit()并不立即執(zhí)行事務(wù)重虑。恰恰相反践付,它將事務(wù)安排排期,一旦準(zhǔn)備好缺厉,就在activity的UI線程上運行(主線程)永高。如果有必要,無論如何提针,你可以從你的UI線程調(diào)用executePendingTransactions()來立即執(zhí)行由commit()提交的事務(wù)命爬。但這么做通常不必要,除非事務(wù)是其他線程中的任務(wù)的一個從屬辐脖。

警告:
你只能在activity保存它的狀態(tài)(當(dāng)用戶離開activity)之前使用commit()提交事務(wù)饲宛。

與Activity通信

盡管Fragment被實現(xiàn)為一個獨立于Activity的對象,并且可以在多個activity中使用嗜价,但一個給定的fragment實例是直接綁定到包含它的activity的艇抠。特別的幕庐,fragment可以使用getActivity()訪問Activity實例,并且容易地執(zhí)行比如在activitylayout中查找一個view的任務(wù)家淤。

View listView =getActivity().findViewById(R.id.list);

同樣地异剥,activity可以通過從FragmentManager獲得一個到Fragment的引用來調(diào)用fragment中的方法,使用findFragmentById() 或 findFragmentByTag()絮重。

ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

為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–一個用來顯示文章列表(framgentA),另一個顯示文章內(nèi)容(fragmentB)–然后framgentA必須告訴activity何時一個listitem被選中擎厢,然后它可以告訴fragmentB去顯示文章究流。

在這個例子中,OnArticleSelectedListener接口在fragmentA中聲明:

  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()來通知fragmentB芬探,從fragmentA到來的事件。為了確保宿主activity實現(xiàn)這個接口厘惦,fragmentA的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)的引用,因此fragmentA可以通過調(diào)用在OnArticleSelectedListener接口中定義的方法分享事件給activity羡玛。例如别智,如果fragmentA是一個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獲取文章敞恋。

添加項目到ActionBar

你的fragment可以通過實現(xiàn)onCreateOptionMenu()提供菜單項給activity的選項菜單(以此類推,ActionBar也一樣)谋右。為了使這個方法接收調(diào)用硬猫,無論如何,你必須在onCreate()期間調(diào)用setHasOptionsMenu()來指出fragment愿意添加item到選項菜單(否則,fragment將接收不到對onCreateOptionsMenu()的調(diào)用)啸蜜。

隨后從fragment添加到Option菜單的任何項馏予,都會被追加到現(xiàn)有菜單項的后面。當(dāng)一個菜單項被選擇盔性,fragment也會接收到對onOptionsItemSelected()的回調(diào)霞丧。也可以在你的fragmentlayout中通過調(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)境菜單惫霸。

處理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和Fragment生命周期對應(yīng)關(guān)系

和activity一樣,你可以使用Bundle保持fragment的狀態(tài)开财,萬一activity的進(jìn)程被干掉汉柒,并且當(dāng)activity被重新創(chuàng)建的時候,你需要恢復(fù)fragment的狀態(tài)時就可以用到责鳍。你可以在fragment的onSaveInstanceState()期間保存狀態(tài),并可以在onCreate()兽间,onCreateView()或onActivityCreated()期間恢復(fù)它历葛。

生命周期方面activity和fragment之間最重要的區(qū)別是各自如何在它的后臺堆棧中儲存。在默認(rèn)情況下,activity在停止后恤溶,它會被放到一個由系統(tǒng)管理的用于保存activity的后臺堆棧乓诽。(因此用戶可以使用BACK按鍵導(dǎo)航回退到它)。

然而咒程,僅當(dāng)你在一個事務(wù)期間移除fragment時鸠天,顯式調(diào)用addToBackStack()請求保存實例時,才被放到一個由宿主activity管理的后臺堆棧帐姻。

另外稠集,管理fragment的生命周期和管理activity生命周期非常類似。因此饥瓷,"managingtheactivitylifecycle"中的相同實踐也同樣適用于fragment剥纷。你需要理解的是,activity的生命如何影響fragment的生命呢铆。

與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)的viewhierarchy時調(diào)用抹剩。

onActivityCreated()
當(dāng)activity的onCreate()方法返回時被調(diào)用撑帖。

onDestroyView()
當(dāng)和fragment關(guān)聯(lián)的viewhierarchy正在被移除時調(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到達(dá)了resumed狀態(tài)祭埂,你可以自由地在activity添加和移除fragment面氓。因此,僅當(dāng)activity處于resumed狀態(tài)時,fragment的生命周期才可以獨立變化舌界。

無論如何掘譬,當(dāng)activity離開resumed狀態(tài),fragment再次被activity的推入它自己的生命周期過程呻拌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葱轩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藐握,更是在濱河造成了極大的恐慌靴拱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趾娃,死亡現(xiàn)場離奇詭異缭嫡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抬闷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門妇蛀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笤成,你說我怎么就攤上這事评架。” “怎么了炕泳?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵纵诞,是天一觀的道長。 經(jīng)常有香客問我培遵,道長浙芙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任籽腕,我火速辦了婚禮嗡呼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皇耗。我一直安慰自己南窗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布郎楼。 她就那樣靜靜地躺著万伤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呜袁。 梳的紋絲不亂的頭發(fā)上敌买,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音傅寡,去河邊找鬼放妈。 笑死北救,一個胖子當(dāng)著我的面吹牛荐操,可吹牛的內(nèi)容都是我干的芜抒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼托启,長吁一口氣:“原來是場噩夢啊……” “哼宅倒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屯耸,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拐迁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疗绣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體线召,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年多矮,在試婚紗的時候發(fā)現(xiàn)自己被綠了缓淹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡塔逃,死狀恐怖讯壶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情湾盗,我是刑警寧澤伏蚊,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站格粪,受9級特大地震影響躏吊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帐萎,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一比伏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吓肋,春花似錦凳怨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至均蜜,卻和暖如春李剖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囤耳。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工篙顺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留偶芍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓德玫,卻偏偏與公主長得像匪蟀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宰僧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容