最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android基礎(chǔ)之Fragment與Activity交互詳解

 更新時(shí)間:2013年07月30日 08:51:41   作者:  
以下小編就為大家介紹一下Fragment跟Activity之間的關(guān)系。需要的朋友可以過來(lái)參考下

今天繼續(xù)講解Fragment組件的特性,主要是跟Activity的交互和生命周期的關(guān)系,我們前面已經(jīng)說(shuō)過Fragment是依賴于Activity的,而且生命周期也跟Activity綁定一起。下面我們看看Fragment跟Activity的關(guān)系。

1、為Activity創(chuàng)建事件回調(diào)方法
在一些情況下, 你可能需要一個(gè)fragment與activity分享事件。 一個(gè)好的方法是在fragment中定義一個(gè)回調(diào)的interface, 并要求宿主activity實(shí)現(xiàn)它。當(dāng)activity通過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中聲明:

復(fù)制代碼 代碼如下:

public static class FragmentA extends ListFragment
{
    //...
    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }
    //...
}

然后fragment的宿主activity實(shí)現(xiàn) OnArticleSelectedListener 接口,并覆寫 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)用) 通過將作為參數(shù)傳入onAttach()的Activity做類型轉(zhuǎn)換來(lái)實(shí)例化一個(gè)OnArticleSelectedListener實(shí)例。
復(fù)制代碼 代碼如下:

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

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ù)是被點(diǎn)擊的項(xiàng)的行ID,activity(或其他fragment)用來(lái)從應(yīng)用的 ContentProvider 獲取文章。

2、添加項(xiàng)目到ActionBar
你的fragment可以通過實(shí)現(xiàn) onCreateOptionMenu() 提供菜單項(xiàng)給activity的選項(xiàng)菜單(以此類推, 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中通過調(diào)用registerForContextMenu() 注冊(cè)一個(gè)view來(lái)提供一個(gè)環(huán)境菜單。當(dāng)用戶打開環(huán)境菜單,fragment接收到一個(gè)對(duì) onCreateContextMenu() 的調(diào)用.當(dāng)用戶選擇一個(gè)項(xiàng)目, fragment接收到一個(gè)對(duì)onContextItemSelected() 的調(diào)用。

注意: 盡管你的fragment會(huì)接收到它所添加的每一個(gè)菜單項(xiàng)被選擇后的回調(diào),但實(shí)際上當(dāng)用戶選擇一個(gè)菜單項(xiàng)時(shí),activity會(huì)首先接收到對(duì)應(yīng)的回調(diào)。如果activity的on-item-selected回調(diào)函數(shù)實(shí)現(xiàn)并沒有處理被選中的項(xiàng)目,然后事件才會(huì)被傳遞到fragment的回調(diào)。

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

3、處理fragment的生命周期
管理fragment的生命周期, 大多數(shù)地方和管理activity生命周期很像.和activity一樣, fragment可以處于3種狀態(tài):
   Resumed
        在運(yùn)行中的activity中fragment可見。
   Paused
        另一個(gè)activity處于前臺(tái)并擁有焦點(diǎn),但是這個(gè)fragment所在的activity仍然可見(前臺(tái)activity局部透明或者沒有覆蓋整個(gè)屏幕)。
   Stopped
        要么是宿主activity已經(jīng)被停止, 要么是fragment從activity被移除但被添加到后臺(tái)堆棧中。
        停止?fàn)顟B(tài)的fragment仍然活著(所有狀態(tài)和成員信息被系統(tǒng)保持著)。然而,它對(duì)用戶不再可見,并且如果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)堆棧。(因此用戶可以使用BACK按鍵導(dǎo)航回退到它)。

然而,僅當(dāng)你在一個(gè)事務(wù)期間移除fragment時(shí),顯式調(diào)用addToBackStack()請(qǐng)求保存實(shí)例時(shí),才被放到一個(gè)由宿主activity管理的后臺(tái)堆棧。

另外,管理fragment的生命周期和管理activity生命周期非常類似。因此, "managing the activitylifecycle"中的相同實(shí)踐也同樣適用于fragment。你需要理解的是,activity的生命如何影響fragment的生命。

4、與activity生命周期的協(xié)調(diào)工作
fragment所生存的activity的生命周期,直接影響fragment的生命周期,每一個(gè)activity的生命周期的回調(diào)行為都會(huì)引起每一個(gè)fragment中類似的回調(diào)。

例如,當(dāng)activity接收到onPause()時(shí),activity中的每一個(gè)fragment都會(huì)接收到onPause()。

Fragment 有一些額外的生命周期回調(diào)方法,那些是處理與activity的唯一的交互,為了執(zhí)行例如創(chuàng)建和銷毀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離開resumed狀態(tài),fragment再次被activity的推入它自己的生命周期過程。

5、總結(jié)
Fragment的相關(guān)知識(shí)暫時(shí)就講到這里,例子Demo可以直接看APIDEMO里面的程序,如果不知道API Demo在哪里,請(qǐng)百度!學(xué)編程需要自己學(xué)會(huì)找答案。

相關(guān)文章

  • 解析Android開發(fā)優(yōu)化之:對(duì)Bitmap的內(nèi)存優(yōu)化詳解

    解析Android開發(fā)優(yōu)化之:對(duì)Bitmap的內(nèi)存優(yōu)化詳解

    在Android應(yīng)用里,最耗費(fèi)內(nèi)存的就是圖片資源。而且在Android系統(tǒng)中,讀取位圖Bitmap時(shí),分給虛擬機(jī)中的圖片的堆棧大小只有8M,如果超出了,就會(huì)出現(xiàn)OutOfMemory異常。所以,對(duì)于圖片的內(nèi)存優(yōu)化,是Android應(yīng)用開發(fā)中比較重要的內(nèi)容
    2013-05-05
  • android閃關(guān)燈的開啟和關(guān)閉方法代碼實(shí)例

    android閃關(guān)燈的開啟和關(guān)閉方法代碼實(shí)例

    這篇文章主要介紹了android閃關(guān)燈的開啟和關(guān)閉方法代碼實(shí)例,本文直接給出代碼和配置實(shí)例,需要的朋友可以參考下
    2015-05-05
  • java創(chuàng)建線程的4種方式集合(最新整理)

    java創(chuàng)建線程的4種方式集合(最新整理)

    在Java中,創(chuàng)建線程有多種方式,每種方式都有其適用場(chǎng)景和優(yōu)缺點(diǎn),下面給大家分享java創(chuàng)建線程的4種方式,感興趣的朋友一起看看吧
    2018-05-05
  • Android studio開發(fā)小型對(duì)話機(jī)器人app(實(shí)例代碼)

    Android studio開發(fā)小型對(duì)話機(jī)器人app(實(shí)例代碼)

    這篇文章主要介紹了Android studio開發(fā)一個(gè)小型對(duì)話機(jī)器人app,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Android在listview添加checkbox實(shí)現(xiàn)原理與代碼

    Android在listview添加checkbox實(shí)現(xiàn)原理與代碼

    Android在listview添加checkbox如何實(shí)現(xiàn)一直都是新手朋友們的頭疼問題,接下來(lái)為您詳細(xì)介紹實(shí)現(xiàn)方法,感興趣的朋友可以了解下
    2013-01-01
  • Android中RecyclerView實(shí)現(xiàn)分頁(yè)滾動(dòng)的方法詳解

    Android中RecyclerView實(shí)現(xiàn)分頁(yè)滾動(dòng)的方法詳解

    RecyclerView實(shí)現(xiàn)滾動(dòng)相信對(duì)大家來(lái)說(shuō)都不陌生,但是本文主要給大家介紹了利用Android中RecyclerView實(shí)現(xiàn)分頁(yè)滾動(dòng)的思路和方法,可以實(shí)現(xiàn)翻頁(yè)功能,一次翻一頁(yè),也可以實(shí)現(xiàn)翻至某一頁(yè)功能。文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04
  • 最新評(píng)論

    定结县| 阜南县| 合川市| 浑源县| 贵港市| 清流县| 常宁市| 华宁县| 皮山县| 宕昌县| 涞水县| 通化市| 枣强县| 秀山| 霍林郭勒市| 东平县| 崇左市| 镇康县| 文昌市| 凌云县| 柘城县| 土默特左旗| 东阳市| 丰县| 新昌县| 西藏| 吴川市| 三门县| 临沧市| 卢湾区| 金沙县| 北安市| 贵州省| 苏尼特左旗| 常熟市| 蓬溪县| 寿阳县| 乾安县| 师宗县| 深水埗区| 娄底市|