Fragment和Activity互動,Fragment回撥
阿新 • • 發佈:2019-02-16
在一些情況下,你可能需要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);
}
...
}