欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

android之Fragment(官網(wǎng)資料翻譯)

系統(tǒng) 1913 0

Fragment要點(diǎn)

  1. Fragment作為Activity界面的一部分組成出現(xiàn)
  2. 可以在一個(gè)Activity中同時(shí)出現(xiàn)多個(gè)Fragment,并且,一個(gè)Fragment亦可在多個(gè)Activity中使用。
  3. 在Activity運(yùn)行過(guò)程中,可以添加、移除或者替換Fragment(add()、remove()、replace())
  4. Fragment可以響應(yīng)自己的輸入事件,并且有自己的生命周期,當(dāng)然,它們的生命周期直接被其所屬的宿主activity的生命周期影響。

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

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

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


fragment在你的應(yīng)用中應(yīng)當(dāng)是一個(gè)模塊化和可重用的組件.即,因?yàn)閒ragment定義了它自己的布局, 以及通過(guò)使用它自己的生命周期回調(diào)方法定義了它自己的行為,你可以將fragment包含到多個(gè)activity中. 這點(diǎn)特別重要, 因?yàn)檫@允許你將你的用戶(hù)體驗(yàn)適配到不同的屏幕尺寸.舉個(gè)例子,你可能會(huì)僅當(dāng)在屏幕尺寸足夠大時(shí),在一個(gè)activity中包含多個(gè)fragment,并且,當(dāng)不屬于這種情況時(shí),會(huì)啟動(dòng)另一個(gè)單獨(dú)的,使用不同fragment的activity.

繼續(xù)之前那個(gè)新聞的例子 -- 當(dāng)運(yùn)行在一個(gè)特別大的屏幕時(shí)(例如平板電腦),應(yīng)用可以在Activity A中嵌入2個(gè)fragment。然而,在一個(gè)正常尺寸的屏幕(例如手機(jī))上,沒(méi)有足夠的空間同時(shí)供2個(gè)fragment用, 因此, Activity A會(huì)僅包含文章列表的fragment, 而當(dāng)用戶(hù)選擇一篇文章時(shí), 它會(huì)啟動(dòng)ActivityB,它包含閱讀文章的fragment.因此, 應(yīng)用可以同時(shí)支持上圖中的2種設(shè)計(jì)模式。


創(chuàng)建Fragment

要?jiǎng)?chuàng)建一個(gè)fragment, 必須創(chuàng)建一個(gè) Fragment 的子類(lèi) (或者繼承自一個(gè)已存在的它的子類(lèi)). Fragment類(lèi)的代碼看起來(lái)很像 Activity 。它包含了和activity類(lèi)似的回調(diào)方法, 例如onCreate()、 onStart()、onPause()以及 onStop()。事實(shí)上, 如果你準(zhǔn)備將一個(gè)現(xiàn)成的Android應(yīng)用轉(zhuǎn)換到使用fragment,可能只需簡(jiǎn)單的將代碼從你的activity的回調(diào)方法分別移動(dòng)到你的fragment的回調(diào)方法即可。

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

  • onCreate()
    當(dāng)創(chuàng)建fragment時(shí), 系統(tǒng)調(diào)用該方法.
    在實(shí)現(xiàn)代碼中,應(yīng)當(dāng)初始化想要在fragment中保持的必要組件, 當(dāng)fragment被暫停或者停止后可以恢復(fù).
  • onCreateView()
    fragment第一次繪制它的用戶(hù)界面的時(shí)候, 系統(tǒng)會(huì)調(diào)用此方法. 為了繪制fragment的UI,此方法必須返回一個(gè)View, 這個(gè)view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
  • onPause()
    用戶(hù)將要離開(kāi)fragment時(shí),系統(tǒng)調(diào)用這個(gè)方法作為第一個(gè)指示(然而它不總是意味著fragment將被銷(xiāo)毀.) 在當(dāng)前用戶(hù)會(huì)話結(jié)束之前,通常應(yīng)當(dāng)在這里提交任何應(yīng)該持久化的變化(因?yàn)橛脩?hù)有可能不會(huì)返回).


其生命周期圖如下:


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

除了繼承基類(lèi) Fragment , 還有一些子類(lèi)你可能會(huì)繼承:

  • DialogFragment
    顯示一個(gè)浮動(dòng)的對(duì)話框.
    用這個(gè)類(lèi)來(lái)創(chuàng)建一個(gè)對(duì)話框,是使用在Activity類(lèi)的對(duì)話框工具方法之外的一個(gè)好的選擇,
    因?yàn)槟憧梢詫⒁粋€(gè)fragment對(duì)話框合并到activity管理的fragment back stack中,允許用戶(hù)返回到一個(gè)之前曾被摒棄的fragment.
  • ListFragment
    顯示一個(gè)由一個(gè)adapter(例如 SimpleCursorAdapter)管理的項(xiàng)目的列表, 類(lèi)似于ListActivity.
    它提供一些方法來(lái)管理一個(gè)list view, 例如 onListItemClick()回調(diào)來(lái)處理點(diǎn)擊事件.
  • PreferenceFragment
    顯示一個(gè) Preference對(duì)象的層次結(jié)構(gòu)的列表, 類(lèi)似于PreferenceActivity.
    這在為你的應(yīng)用創(chuàng)建一個(gè)"設(shè)置"activity時(shí)有用處.

添加一個(gè)用戶(hù)界面

fragment通常用來(lái)作為一個(gè)activity的用戶(hù)界面的一部分,并將它的layout提供給activity.為了給一個(gè)fragment提供一 個(gè)layout,你必須實(shí)現(xiàn) onCreateView()回調(diào)方法, 當(dāng)?shù)搅薴ragment繪制它自己的layout的時(shí)候,Android系統(tǒng)調(diào)用它.你的此方法的實(shí)現(xiàn)代碼必須返回一個(gè)你的fragment的 layout的根view.
注意 : 如果你的fragment是ListFragment的子類(lèi),它的默認(rèn)實(shí)現(xiàn)是返回從onCreateView()返回一個(gè)ListView,所以一般情況下不必實(shí)現(xiàn)它.
從onCreateView()返回的View, 也可以從一個(gè)layout的xml資源文件中讀取并生成. 為了幫助你這么做, onCreateView() 提供了一個(gè)LayoutInflater 對(duì)象.

舉個(gè)例子, 這里有一個(gè)Fragment的子類(lèi), 從文件 example_fragment.xml 加載了一個(gè)layout:

  1. public static class ExampleFragment extends Fragment{
  2. @Override
  3. public ViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
  4. BundlesavedInstanceState){
  5. //Inflatethelayoutforthisfragment
  6. return inflater.inflate(R.layout.example_fragment,container, false );
  7. }
  8. }

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

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

  • 想要加載的layout的resource ID.
  • 加載的layout的父ViewGroup.
    傳入container是很重要的, 目的是為了讓系統(tǒng)接受所要加載的layout的根view的layout參數(shù),
    由它將掛靠的父view指定.
  • 布爾值指示在加載期間, 展開(kāi)的layout是否應(yīng)當(dāng)附著到ViewGroup (第二個(gè)參數(shù)).
    (在這個(gè)例子中, 指定了false, 因?yàn)橄到y(tǒng)已經(jīng)把展開(kāi)的layout插入到container –傳入true會(huì)在最后的layout中創(chuàng)建一個(gè)多余的view group.)

將fragment添加到activity

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

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

  1. <? xml version = "1.0" encoding = "utf-8" ?>
  2. < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
  3. android:orientation = "horizontal"
  4. android:layout_width = "match_parent"
  5. android:layout_height = "match_parent" >
  6. < fragment android:name = "com.example.news.ArticleListFragment"
  7. android:id = "@+id/list"
  8. android:layout_weight = "1"
  9. android:layout_width = "0dp"
  10. android:layout_height = "match_parent" />
  11. < fragment android:name = "com.example.news.ArticleReaderFragment"
  12. android:id = "@+id/viewer"
  13. android:layout_weight = "2"
  14. android:layout_width = "0dp"
  15. android:layout_height = "match_parent" />
  16. </ LinearLayout >

<fragment> 中的 android:name屬性指定了在layout中實(shí)例化的Fragment類(lèi).
當(dāng)系統(tǒng)創(chuàng)建這個(gè)activity layout時(shí),它實(shí)例化每一個(gè)在layout中指定的fragment,并調(diào)用每一個(gè)上的onCreateView()方法,來(lái)獲取每一個(gè) fragment的layout.系統(tǒng)將從fragment返回的 View直接插入到<fragment>元素所在的地方.
注意
: 每一個(gè)fragment都需要一個(gè)唯一的標(biāo)識(shí),如果activity重啟,系統(tǒng)可以用來(lái)恢復(fù)fragment(并且你也可以用來(lái)捕獲fragment來(lái)處理事務(wù),例如移除它.)

有3種方法來(lái)為一個(gè)fragment提供一個(gè)標(biāo)識(shí):

  • 為 android:id 屬性提供一個(gè)唯一ID.
  • 為 android:tag 屬性提供一個(gè)唯一字符串.
  • 如果以上2個(gè)你都沒(méi)有提供, 系統(tǒng)使用容器view的ID.

撰寫(xiě)代碼將fragment添加到一個(gè)已存在的ViewGroup.

當(dāng)activity運(yùn)行的任何時(shí)候, 都可以將fragment添加到activity layout.只需簡(jiǎn)單的指定一個(gè)需要放置fragment的ViewGroup.為了在你的 activity中操作fragment事務(wù)(例如添加,移除,或代替一個(gè)fragment),必須使用來(lái)自FragmentTransaction 的API.
可以按如下方法,從你的Activity取得一個(gè) FragmentTransaction 的實(shí)例:

  1. FragmentManagerfragmentManager=getFragmentManager();
  2. FragmentTransactionfragmentTransaction=fragmentManager.beginTransaction();

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

  1. ExampleFragmentfragment=newExampleFragment();
  2. fragmentTransaction.add(R.id.fragment_container,fragment);
  3. fragmentTransaction.commit();

add()的第一個(gè)參數(shù)是fragment要放入的ViewGroup, 由resource ID指定,第二個(gè)參數(shù)是需要添加的fragment.一旦用FragmentTransaction做了改變,為了使改變生效,必須調(diào)用commit().


添加一個(gè)無(wú)UI的fragment

之前的例子展示了對(duì)UI的支持, 如何將一個(gè)fragment添加到activity.然而,也可以使用fragment來(lái)為activity提供后臺(tái)行為而不用展現(xiàn)額外的UI.
要添加一個(gè)無(wú)UI的fragment, 需要從activity使用 add(Fragment, String)來(lái)添加fragment (為fragment提供一個(gè)唯一的字符串"tag", 而不是一個(gè)view ID).這么做添加了fragment,但因?yàn)樗鼪](méi)有關(guān)聯(lián)到一個(gè)activity layout中的一個(gè)view, 所以不會(huì)接收到onCreateView()調(diào)用.因此不必實(shí)現(xiàn)此方法.
為fragment提供一個(gè)字符串tag并不是專(zhuān)門(mén)針對(duì)無(wú)UI的fragment的–也可以提供字符串tag給有UI的fragment–但是如果fragment沒(méi)有UI,那么這個(gè)tag是僅有的標(biāo)識(shí)它的途徑.如果隨后你想從activity獲取這個(gè)fragment, 需要使用 findFragmentByTag().


管理Fragment

要在activity中管理fragment,需要使用FragmentManager. 通過(guò)調(diào)用activity的getFragmentManager()取得它的實(shí)例.
可以通過(guò)FragmentManager做一些事情, 包括:

  • 使用findFragmentById()(用于在activity layout中提供一個(gè)UI的fragment)或findFragmentByTag()(適用于有或沒(méi)有UI的fragment)獲取activity中存在的fragment
  • 將fragment從后臺(tái)堆棧中彈出, 使用 popBackStack() (模擬用戶(hù)按下BACK 命令).
  • 使用addOnBackStackChangeListener()注冊(cè)一個(gè)監(jiān)聽(tīng)后臺(tái)堆棧變化的listener.

處理Fragment事務(wù)

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

從 FragmentManager 獲得一個(gè)FragmentTransaction實(shí)例 :

  1. FragmentManagerfragmentManager=getFragmentManager();
  2. FragmentTransactionfragmentTransaction=fragmentManager.beginTransaction();

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

  在調(diào)用commit()之前, 你可能想調(diào)用 addToBackStack(),將事務(wù)添加到一個(gè)fragment事務(wù)的backstack. 這個(gè)back stack由activity管理, 并允許用戶(hù)通過(guò)按下 BACK按鍵返回到前一個(gè)fragment狀態(tài).

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

  1. //Createnewfragmentandtransaction
  2. FragmentnewFragment=newExampleFragment();
  3. FragmentTransactiontransaction=getFragmentManager().beginTransaction();
  4. //Replacewhateverisinthefragment_containerviewwiththisfragment,
  5. //andaddthetransactiontothebackstack
  6. transaction.replace(R.id.fragment_container,newFragment);
  7. transaction.addToBackStack( null );
  8. //Committhetransaction
  9. transaction.commit();

在這個(gè)例子中,newFragment替換了當(dāng)前l(fā)ayout容器中的由R.id.fragment_container標(biāo)識(shí)的fragment.通過(guò)調(diào)用 addToBackStack(), replace事務(wù)被保存到back stack,因此用戶(hù)可以回退事務(wù),并通過(guò)按下BACK按鍵帶回前一個(gè)fragment.
如果添加多個(gè)變化到事務(wù)(例如add()或remove())并調(diào)用addToBackStack(),然后在你調(diào)用commit()之前的所有應(yīng)用的變化會(huì)被作為一個(gè)單個(gè)事務(wù)添加到后臺(tái)堆棧, BACK按鍵會(huì)將它們一起回退.
添加變化到 FragmentTransaction的順序不重要, 除以下例外:

  • 必須最后調(diào)用 commit().
  • 如果添加多個(gè)fragment到同一個(gè)容器, 那么添加的順序決定了它們?cè)趘iew hierarchy中顯示的順序.
當(dāng)執(zhí)行一個(gè)移除fragment的事務(wù)時(shí), 如果沒(méi)有調(diào)用 addToBackStack(), 那么當(dāng)事務(wù)提交后,那個(gè)fragment會(huì)被銷(xiāo)毀,并且用戶(hù)不能導(dǎo)航回到它. 有鑒于此, 當(dāng)移除一個(gè)fragment時(shí),如果調(diào)用了addToBackStack(), 那么fragment會(huì)被停止, 如果用戶(hù)導(dǎo)航回來(lái),它將會(huì)被恢復(fù).
提示: 對(duì)于每一個(gè)fragment事務(wù), 你可以應(yīng)用一個(gè)事務(wù)動(dòng)畫(huà),通過(guò)在提交事務(wù)之前調(diào)用setTransition()實(shí)現(xiàn).

調(diào)用 commit() 并不立即執(zhí)行事務(wù).恰恰相反, 它將事務(wù)安排排期, 一旦準(zhǔn)備好,就在activity的UI線程上運(yùn)行(主線程).如果有必要, 無(wú)論如何, 你可以從你的UI線程調(diào)用executePendingTransactions()來(lái)立即執(zhí)行由commit()提交的事務(wù). 但這么做通常不必要,除非事務(wù)是其他線程中的任務(wù)的一個(gè)從屬.

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

與Activity通信

盡管Fragment被實(shí)現(xiàn)為一個(gè)獨(dú)立于Activity的對(duì)象,并且可以在多個(gè)activity中使用,但一個(gè)給定的fragment實(shí)例是直接綁定到包含它的activity的. 特別的,fragment可以使用 getActivity() 訪問(wèn)Activity實(shí)例, 并且容易地執(zhí)行比如在activity layout中查找一個(gè)view的任務(wù).

  1. ViewlistView=getActivity().findViewById(R.id.list);<spanstyle= "font-family:System;" ></span>

同樣地,activity可以通過(guò)從FragmentManager獲得一個(gè)到Fragment的引用來(lái)調(diào)用fragment中的方法, 使用findFragmentById() 或 findFragmentByTag().

  1. ExampleFragmentfragment=(ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment);

為Activity創(chuàng)建事件回調(diào)方法

在一些情況下, 你可能需要一個(gè)fragment與activity分享事件. 一個(gè)好的方法是在fragment中定義一個(gè)回調(diào)的interface, 并要求宿主activity實(shí)現(xiàn)它.當(dāng)activity通過(guò)interface接收到一個(gè)回調(diào), 必要時(shí)它可以和在layout中的其他fragment分享信息.
例如, 如果一個(gè)新的應(yīng)用在activity中有2個(gè)fragment – 一個(gè)用來(lái)顯示文章列表(framgent A), 另一個(gè)顯示文章內(nèi)容(fragment B) – 然后 framgent A必須告訴activity何時(shí)一個(gè)list item被選中,然后它可以告訴fragmentB去顯示文章.
在這個(gè)例子中, OnArticleSelectedListener 接口在fragment A中聲明:

  1. public static class FragmentA extends ListFragment{
  2. ...
  3. //ContainerActivitymustimplementthisinterface
  4. public interface OnArticleSelectedListener{
  5. public void onArticleSelected(UriarticleUri);
  6. }
  7. ...
  8. }

然后fragment的宿主activity實(shí)現(xiàn) OnArticleSelectedListener 接口, 并覆寫(xiě) onArticleSelected() 來(lái)通知fragment B,從fragment A到來(lái)的事件.為了確保宿主activity實(shí)現(xiàn)這個(gè)接口, fragment A的 onAttach() 回調(diào)方法(當(dāng)添加fragment到activity時(shí)由系統(tǒng)調(diào)用) 通過(guò)將作為參數(shù)傳入onAttach()的Activity做類(lèi)型轉(zhuǎn)換來(lái)實(shí)例化一個(gè)OnArticleSelectedListener實(shí)例.

  1. public static class FragmentA extends ListFragment{
  2. OnArticleSelectedListenermListener;
  3. ...
  4. @Override
  5. public void onAttach(Activityactivity){
  6. super .onAttach(activity);
  7. try {
  8. mListener=(OnArticleSelectedListener)activity;
  9. } catch (ClassCastExceptione){
  10. throw new ClassCastException(activity.toString()+ "mustimplementOnArticleSelectedListener" );
  11. }
  12. }
  13. ...
  14. }


如果activity沒(méi)有實(shí)現(xiàn)接口, fragment會(huì)拋出 ClassCastException 異常. 正常情形下,mListener成員會(huì)保持一個(gè)到activity的OnArticleSelectedListener實(shí)現(xiàn)的引用, 因此fragment A可以通過(guò)調(diào)用在OnArticleSelectedListener接口中定義的方法分享事件給activity.例如, 如果fragment A是一個(gè) ListFragment的子類(lèi), 每次用戶(hù)點(diǎn)擊一個(gè)列表項(xiàng), 系統(tǒng)調(diào)用在fragment中的onListItemClick(),然后后者調(diào)用 onArticleSelected() 來(lái)分配事件給activity.


  1. public static class FragmentA extends ListFragment{
  2. OnArticleSelectedListenermListener;
  3. ...
  4. @Override
  5. public void onListItemClick(ListViewl,Viewv, int position, long id){
  6. //Appendtheclickeditem'srowIDwiththecontentproviderUri
  7. UrinoteUri=ContentUris.withAppendedId(ArticleColumns.CONTENT_URI,id);
  8. //SendtheeventandUritothehostactivity
  9. mListener.onArticleSelected(noteUri);
  10. }
  11. ...
  12. }

傳給 onListItemClick() 的 id 參數(shù)是被點(diǎn)擊的項(xiàng)的行ID, activity(或其他fragment)用來(lái)從應(yīng)用的 ContentProvider 獲取文章.

添加項(xiàng)目到ActionBar

你的fragment可以通過(guò)實(shí)現(xiàn) onCreateOptionMenu() 提供菜單項(xiàng)給activity的選項(xiàng)菜單(以此類(lèi)推, Action Bar也一樣).為了使這個(gè)方法接收調(diào)用,無(wú)論如何, 你必須在 onCreate() 期間調(diào)用 setHasOptionsMenu() 來(lái)指出fragment愿意添加item到選項(xiàng)菜單(否則, fragment將接收不到對(duì) onCreateOptionsMenu()的調(diào)用).
隨后從fragment添加到Option菜單的任何項(xiàng),都會(huì)被追加到現(xiàn)有菜單項(xiàng)的后面.當(dāng)一個(gè)菜單項(xiàng)被選擇, fragment也會(huì)接收到 對(duì) onOptionsItemSelected() 的回調(diào).也可以在你的fragment layout中通過(guò)調(diào)用registerForContextMenu() 注冊(cè)一個(gè)view來(lái)提供一個(gè)環(huán)境菜單.當(dāng)用戶(hù)打開(kāi)環(huán)境菜單, fragment接收到一個(gè)對(duì) onCreateContextMenu() 的調(diào)用.當(dāng)用戶(hù)選擇一個(gè)項(xiàng)目, fragment接收到一個(gè)對(duì)onContextItemSelected() 的調(diào)用.
注意: 盡管你的fragment會(huì)接收到它所添加的每一個(gè)菜單項(xiàng)被選擇后的回調(diào),但實(shí)際上當(dāng)用戶(hù)選擇一個(gè)菜單項(xiàng)時(shí), activity會(huì)首先接收到對(duì)應(yīng)的回調(diào).如果activity的on-item-selected回調(diào)函數(shù)實(shí)現(xiàn)并沒(méi)有處理被選中的項(xiàng)目, 然后事件才會(huì)被傳遞到fragment的回調(diào).

這個(gè)規(guī)則適用于選項(xiàng)菜單和環(huán)境菜單.

處理fragment的生命周期


管理fragment的生命周期, 大多數(shù)地方和管理activity生命周期很像.和activity一樣, fragment可以處于3種狀態(tài):
Resumed
在運(yùn)行中的activity中fragment可見(jiàn).
Paused
另一個(gè)activity處于前臺(tái)并擁有焦點(diǎn), 但是這個(gè)fragment所在的activity仍然可見(jiàn)(前臺(tái)activity局部透明或者沒(méi)有覆蓋整 個(gè)屏幕).
Stopped
要么是宿主activity已經(jīng)被停止, 要么是fragment從activity被移除但被添加到后臺(tái)堆棧中.
停止?fàn)顟B(tài)的fragment仍然活著(所有狀態(tài)和成員信息被系統(tǒng)保持著). 然而, 它對(duì)用戶(hù)不再可見(jiàn), 并且如果activity被干掉, 他也會(huì)被干掉.

其對(duì)應(yīng)關(guān)系圖如下:



和activity一樣, 你可以使用Bundle保持fragment的狀態(tài), 萬(wàn)一activity的進(jìn)程被干掉,并且當(dāng)activity被重新創(chuàng)建的時(shí)候, 你需要恢復(fù)fragment的狀態(tài)時(shí)就可以用到. 你可以在fragment的 onSaveInstanceState() 期間保存狀態(tài), 并可以在 onCreate(), onCreateView() 或 onActivityCreated() 期間恢復(fù)它.
生命周期方面activity和fragment之間最重要的區(qū)別是各自如何在它的后臺(tái)堆棧中儲(chǔ)存. 在默認(rèn)情況下, activity在停止后, 它會(huì)被放到一個(gè)由系統(tǒng)管理的用于保存activity的后臺(tái)堆棧.(因此用戶(hù)可以使用BACK按鍵導(dǎo)航回退到它).
然而, 僅當(dāng)你在一個(gè)事務(wù)期間移除fragment時(shí),顯式調(diào)用addToBackStack()請(qǐng)求保存實(shí)例時(shí),才被放到一個(gè)由宿主activity管理的后臺(tái)堆棧.
另外, 管理fragment的生命周期和管理activity生命周期非常類(lèi)似.因此, "managing the activitylifecycle"中的相同實(shí)踐也同樣適用于fragment. 你需要理解的是,activity的生命如何影響fragment的生命.

與activity生命周期的協(xié)調(diào)工作

fragment所生存的activity的生命周期,直接影響fragment的生命周期,每一個(gè)activity的生命周期的回調(diào)行為都會(huì)引起每一個(gè)fragment中類(lèi)似的回調(diào).
例如,當(dāng)activity接收到onPause()時(shí),activity中的每一個(gè)fragment都會(huì)接收到onPause().
Fragment 有一些額外的生命周期回調(diào)方法, 那些是處理與activity的唯一的交互,為了執(zhí)行例如創(chuàng)建和銷(xiāo)毀fragment的UI的動(dòng)作. 這些額外的回調(diào)方法是:
  • onAttach()
    當(dāng)fragment被綁定到activity時(shí)被調(diào)用(Activity會(huì)被傳入.).
  • onCreateView()
    創(chuàng)建和fragment關(guān)聯(lián)的view hierarchy時(shí)調(diào)用.
  • onActivityCreated()
    當(dāng)activity的onCreate()方法返回時(shí)被調(diào)用.
  • onDestroyView()
    當(dāng)和fragment關(guān)聯(lián)的view hierarchy正在被移除時(shí)調(diào)用.
  • onDetach()
    當(dāng)fragment從activity解除關(guān)聯(lián)時(shí)被調(diào)用.

fragment生命周期的流程, 以及宿主activity對(duì)它的影響,在圖3中顯示.在這個(gè)圖中,可以看到activity依次的每個(gè)狀態(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)時(shí), fragment的生命周期才可以獨(dú)立變化.
無(wú)論如何, 當(dāng)activity離開(kāi)resumed狀態(tài),fragment再次被activity的推入它自己的生命周期過(guò)程.

android之Fragment(官網(wǎng)資料翻譯)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品欧美小视频在线观看 | 亚洲欧美中文字幕 | 亚洲精品久久久久久久久久吃药 | 日韩精品一区二区在线观看 | 激情网五月天 | 日韩男人天堂 | 岛国色情A片无码视频免费看 | 日韩大尺度电影在线观看 | 国产精品v在线播放观看 | 色a综合| 亚洲综合五月天激动情网 | 爱爱视频在线观看 | 精品国产成a人在线观看 | 一本大道香蕉中文日本不卡高清二区 | 人妻体内射精一区二区三四 | 刮伦人妇A片1级 | 精品日本三级在线观看视频 | 9191精品国产免费不久久 | av在线播放国产 | 五月婷婷爱| 国产一级特黄aa大片爽爽 | 精品欧美成人高清视频在线观看 | 国产日韩在线观看一区 | 国产亚洲综合在线 | 免费看搡女人的视频 | 国产精品一二三 | 国产精品亚洲一区 | 国产精品国产 | 色欲AV蜜臀AV在线观看麻豆 | 日韩a无吗一区二区三区 | 亚洲国产精品一区二区久久 | 天天色综合天天 | 婷婷丁香社区 | 亚洲福利电影网 | 91五月天| 精品一二三区 | 激情91 | 女人一级毛片免费视频观看 | 天天操天天碰 | 91九色精品国产 | 亚洲欧洲高清有无 |