1. 程式人生 > >Fragment和Activity互動,Fragment回撥

Fragment和Activity互動,Fragment回撥

在一些情況下,你可能需要fragment與activity共享事件。

這樣做的一個好方法是在fragment內部定義一個回撥介面,並需要宿主activity實現它。當activity通過介面接收到回撥時,可以在必要時與佈局中的其它fragment共享資訊。

舉個例子,如果新聞應用的actvity中有兩個fragment——一個顯示文章列表(fragment A),另一個顯示一篇文章(fragment B)——然後fragment A 必須要告訴activity列表項何時被選種,這樣,activity可以通知fragment B顯示這篇文章。

步驟如下:

1.這種情況下,在fragment A內部宣告介面OnArticleSelectedListener:


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

2.然後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 implement OnArticleSelectedListener");
        }
    }
    ...

}

如果activity沒有實現這個介面,那麼fragment會丟擲一個ClassCaseException異常。一旦成功,mListener成員會保留一個activity的OnArticleSelectedListener實現的引用,由此fragment A可以通過呼叫由OnArticleSelectedListener介面定義的方法與activity共享事件。例如,如果fragment A是ListFragment的子類,每次使用者點選列表項時,系統都會呼叫fragment的onListItemClick()事件,然後fragment呼叫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);
    }
    ...
}