Activity和fragment之间怎么通过回调传输数据

最近遇到一个fragment和Activity之间传输数据的问题,当时本能想到了这个方法

Bundle bundle=getArguments();

这样做当然是可以的,但是好像Api里不建议这么做,于是我就想到回调函数。回调函数传参数好像可以试试,于是我绞尽脑汁(原谅我薄弱的基础),在一些网上提供的方法上不断尝试终于成功了,赶紧在这里记下我的笔记,省的忘了

第一步当然是写出要回调的接口:

public interface AgrotechCallBack {

    public void callbackFun(String arg);

}

第二步是在要穿参数的fragment和Activity里实现这个接口
fragment里要实现的是

@Override
    public void onAttach(Activity activity) {
        agrotechCallBack= (AgrotechCallBack) activity;
        super.onAttach(activity);
    }

Activity里要实现的是:
先实现这个接口,然后再方法里操作

@Override
    public void onAttachFragment(android.app.Fragment fragment) {
        agrotechCallBack= (AgrotechCallBack) fragment;
        super.onAttachFragment(fragment);
    }

这个回调是成功了,接下来就要在实现的接口里的方法来做你要做的操作,那么在另一个你要类里的同样通过接口实现的方法,自然就会执行,就可以得到你要的参数了。

———-分割线



刚从网上看了一个方法很不错,所以就顺手复制到下面了,跟上面的方法是异曲同工。转自::::::
http://www.cnblogs.com/mengdd/archive/2013/01/11/2856374.html

**

创建事件回调

**
一些情况下,可能需要fragment和activity共享事件,一个比较好的做法是在fragment里面定义一个回调接口,然后要求宿主activity实现它。

  当activity通过这个接口接收到一个回调,它可以同布局中的其他fragment分享这个信息。

  例如,一个新闻显示应用在一个activity中有两个fragment,一个fragment A显示文章题目的列表,一个fragment B显示文章。

  所以当一个文章被选择的时候,fragment A必须通知activity,然后activity通知fragment B,让它显示这篇文章。

  这个情况下,在fragment A中声明一个这样的接口OnArticleSelectedListener:
  

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 A中发生的事通知fragment B。

  为了确保宿主activity实现这个接口,fragment A的onAttach() 方法(这个方法在fragment 被加入到activity中时由系统调用)中通过将传入的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接口的一个引用,所以通过调用OnArticleSelectedListener接口的方法,fragment A可以和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);
    }
    ...
}

你可能感兴趣的:(Activity,fragment,传参)