Android基礎之Fragment與Activity互動詳解

來源:互聯網
上載者:User

以下小編就為大家介紹一下Fragment跟Activity之間的關係。需要的朋友可以過來參考下 

今天繼續講解Fragment組件的特性,主要是跟Activity的互動和生命週期的關係,我們前面已經說過Fragment是依賴於Activity的,而且生命週期也跟Activity綁定一起。下面我們看看Fragment跟Activity的關係。

1、為Activity建立事件回調方法
在 一些情況下, 你可能需要一個fragment與activity分享事件。 一個好的方法是在fragment中定義一個回調的interface, 並要求宿主activity實現它。當activity通過interface接收到一個回調, 必要時它可以和在layout中的其他fragment分享資訊。例如, 如果一個新的應用在activity中有2個fragment – 一個用來顯示文章列表(framgent A), 另一個顯示文章內容(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實現 OnArticleSelectedListener 介面,並覆寫 onArticleSelected() 來通知fragment B,從fragment A到來的事件。為了確保宿主activity實現這個介面, fragment A的 onAttach() 回調方法(當添加fragment到activity時由系統調用) 通過將作為參數傳入onAttach()的Activity做類型轉換來執行個體化一個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沒有實現介面,fragment會拋出 ClassCastException 異常。正常情形下,mListener成員會保持一個到activity的OnArticleSelectedListener實現的引用,因此 fragment A可以通過調用在OnArticleSelectedListener介面中定義的方法分享事件給activity。例如,如果fragment A是一個 ListFragment的子類, 每次使用者點擊一個清單項目,系統調用在fragment中的onListItemClick(),然後後者調用 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 參數是被點擊的項的行ID,activity(或其他fragment)用來從應用的 ContentProvider 擷取文章。

2、添加項目到ActionBar
你 的fragment可以通過實現 onCreateOptionMenu() 提供功能表項目給activity的選項菜單(以此類推, Action Bar也一樣)。為了使這個方法接收調用,無論如何,你必須在 onCreate() 期間調用 setHasOptionsMenu() 來指出fragment願意添加item到選項菜單(否則, fragment將接收不到對 onCreateOptionsMenu()的調用)。

隨後從fragment添加到Option菜單的任何項,都會被追加到現有功能表項目的後面。當一個功能表項目被選擇,fragment也會接收到 對 onOptionsItemSelected() 的回調。也可以在你的fragment layout中通過調用registerForContextMenu() 註冊一個view來提供一個環境菜單。當使用者開啟環境菜單,fragment接收到一個對 onCreateContextMenu() 的調用.當使用者選擇一個項目, fragment接收到一個對onContextItemSelected() 的調用。

注意: 儘管你的fragment會接收到它所添加的每一個功能表項目被選擇後的回調,但實際上當使用者選擇一個功能表項目時,activity會首先接收到對應的回調。如 果activity的on-item-selected回呼函數實現並沒有處理被選中的項目,然後事件才會被傳遞到fragment的回調。

這個規則適用於選項菜單和環境菜單。

3、處理fragment的生命週期
管理fragment的生命週期, 大多數地方和管理activity生命週期很像.和activity一樣, fragment可以處於3種狀態:
   Resumed
        在運行中的activity中fragment可見。
   Paused
        另一個activity處於前台並擁有焦點,但是這個fragment所在的activity仍然可見(前台activity局部透明或者沒有覆蓋整個螢幕)。
   Stopped
        要麼是宿主activity已經被停止, 要麼是fragment從activity被移除但被添加到後台堆棧中。
        停止狀態的fragment仍然活著(所有狀態和成員資訊被系統保持著)。然而,它對使用者不再可見,並且如果activity被幹掉,他也會被幹掉。
其對應關係圖如下:

和activity一樣, 你可以使用Bundle保持fragment的狀態,萬一activity的進程被幹掉,並且當activity被重新建立的時候, 你需要恢複fragment的狀態時就可以用到. 你可以在fragment的 onSaveInstanceState() 期間儲存狀態,並可以在 onCreate(),onCreateView() 或 onActivityCreated() 期間恢複它。

生命週期方面activity和fragment之間最重要的區別是各自如何在它的後台堆棧中儲存。 在預設情況下,activity在停止後,它會被放到一個由系統管理的用於儲存activity的後台堆棧。(因此使用者可以使用BACK按鍵導航回退到它)。

然而,僅當你在一個事務期間移除fragment時,顯式調用addToBackStack()請求儲存執行個體時,才被放到一個由宿主activity管理的後台堆棧。

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

4、與activity生命週期的協調工作
fragment所生存的activity的生命週期,直接影響fragment的生命週期,每一個activity的生命週期的回調行為都會引起每一個fragment中類似的回調。

例如,當activity接收到onPause()時,activity中的每一個fragment都會接收到onPause()。

Fragment 有一些額外的生命週期回調方法,那些是處理與activity的唯一的互動,為了執行例如建立和銷毀fragment的UI的動作。這些額外的回調方法是:

•onAttach()
當fragment被綁定到activity時被調用(Activity會被傳入)
•onCreateView()
建立和fragment關聯的view hierarchy時調用
•onActivityCreated()
當activity的onCreate()方法返回時被調用
•onDestroyView()
當和fragment關聯的view hierarchy正在被移除時調用
•onDetach()
當fragment從activity解除關聯時被調用
fragment 生命週期的流程,以及宿主activity對它的影響,在圖3中顯示。在這個圖中,可以看到activity依次的每個狀態是如何決定fragment可 能接收到的回調方法。例如,當activity接收到它的onCreate(),activity中的fragment接收到最多是 onActivityCreated()。
一旦activity到達了resumed狀態,你可以自由地在activity添加和移除fragment。因此,僅當activity處於resumed狀態時, fragment的生命週期才可以獨立變化。
無論如何,當activity離開resumed狀態,fragment再次被activity的推入它自己的生命週期過程。

5、總結
Fragment的相關知識暫時就講到這裡,例子Demo可以直接看APIDEMO裡面的程式,如果不知道API Demo在哪裡,請百度!學編程需要自己學會找答案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.