Android應用程式學習筆記
Communicating with the Activity
雖然fragment可以做為物件獨立於activity,也可以使用在多個activities,預設的fragment實體是直接與activity綁定。
特別是,fragment透過getActivity()方法可以存取Activity並輕鬆地執行工作比如取得activity布局的view。
View listView = getActivity()
.findViewById
(R.id.list);
同樣地,你的activity也可以呼叫fragment中的方法,透過findFragmentById()方法或是findFragmentByTag()方法。
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
Creating event callbacks to the Activity
在一些情況中,你需要一個fragment與activity分享一個事件,在fragment定義一個回呼的介面並要求寄主activity執行是一個分享事件的好方法。當activity從界面接收到回呼,介面就會將資訊分享給在布局中的其他需要的fragment。
舉例,如果新聞應用程式有兩個fragment在activity中-一個顯示文章列表(Fragment A)-其他顯示文章內容(Fragment B),當一個列表選項被選到時,Fragment A必須告訴activity以便activity可以呼叫Fragment B去顯示文章內容,在此例中,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()回呼方法將實體化OnArticleSelectedListener的Activity傳入onAttach()方法。
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就會丟出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,id用來從activity的ContentProvider取文章。