为Activity创建事件回调方法
在一些情况下, 你可能需要一个fragment与activity分享事件. 一个好的方法是在fragment中定义一个
回调的interface, 并要求宿主activity实现它.当activity通过interface接收到一个回调, 必要时它可以和在
layout中的其他fragment分享信息.
例如, 如果一个新的应用在activity中有2个fragment – 一个用来显示文章列表(framgent A), 另一个显
示文章内容(fragment B) – 然后 framgent A必须告诉activity何时一个list item被选中,然后它可以告诉
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() 回调
方法(当添加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会抛出 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 获取文章.
|