Fragments (Android官方文档中文版二)

来源:互联网 发布:可视化网址导航源码 编辑:程序博客网 时间:2024/06/08 16:29
为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中声明: 
  1. public static class FragmentA extends ListFragment {
  2.      ...
  3.      // Container Activity must implement this interface
  4.      public interface OnArticleSelectedListener {
  5.          public void onArticleSelected(Uri articleUri);

  6.      }
  7.      ... 
  8. }
复制代码

       然后fragment的宿主activity实现 OnArticleSelectedListener 接口, 并覆写 onArticleSelected() 来通知
fragment B,从fragment A到来的事件.为了确保宿主activity实现这个接口, fragment A的 onAttach() 回调
方法(当添加fragment到activity时由系统调用) 通过将作为参数传入onAttach()的Activity做类型转换来实
例化一个OnArticleSelectedListener实例. 
  1. public static class FragmentA extends ListFragment {
  2.      OnArticleSelectedListener mListener;
  3.      ...
  4.      @Override
  5.      public void onAttach(Activity activity) {
  6.          super.onAttach(activity);
  7.          try {
  8.              mListener = (OnArticleSelectedListener) activity;
  9.          } catch (ClassCastException e) {
  10.              throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
  11.          }
  12.      }

  13.      ... 

  14. }
复制代码

      如果activity没有实现接口, fragment会抛出 ClassCastException 异常. 正常情形下, mListener成员会
保持一个到activity的OnArticleSelectedListener实现的引用, 因此fragment A可以通过调用在
OnArticleSelectedListener接口中定义的方法分享事件给activity.例如, 如果fragment A是一个
ListFragment的子类, 每次用户点击一个列表项, 系统调用在fragment中的onListItemClick(),然后后者调用
 onArticleSelected() 来分配事件给activity. 
  1. public static class FragmentA extends ListFragment {
  2.      OnArticleSelectedListener mListener;
  3.      ...
  4.      @Override
  5.      public void onListItemClick(ListView l, View v, int position, long id) {
  6.          // Append the clicked item's row ID with the content provider Uri 
  7.          Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
  8.          // Send the event and Uri to the host activity
  9.         mListener.onArticleSelected(noteUri);
  10.      }

  11.      ... 

  12. }
复制代码
       传给 onListItemClick() 的 id 参数是被点击的项的行ID, activity(或其他fragment)用来从应用的
ContentProvider 获取文章.
原创粉丝点击