1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据;
2.在Fragment中,在onAttach()函数中通过调用getArguments()获得一个Bundle对象,从而获取我们提供的数据。
比如说:新闻浏览情境下,共有两个Fragment,一个是用来显示新闻标题;另外一个用来显示新闻内容。当我们点击新闻标题的时候,新闻的内容就显示到另外一个Fragment当中了。下面我们就来通过按下Fragment1中的button来传递一个消息到Fragment2中。
首先我们要做的是,在Fragment1中创建一个回调接口,并且在Activity中重写他的方法,传递信息给Fragment2(举一反三:我们也可以传递给其他的Fragment)。
1.创建回调接口;
public interface OnButtonClickListener { public void onButtonClicked(); }
2.为了确保宿主activity实现这个接口,fragment1的onAttach() 方法中通过将传入的activity强制类型转换,实例化一个OnButtonClickListener对象;
@Override public void onAttach(Activity activity) { Log.v(TAG, "Fragment1 onAttach"); Bundle args = getArguments(); if (null != args) { // 在这里我们可以将从Acivity收到的数据保存起来,并且显示到Fragment当中。 try { mListener = (OnButtonClickListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnButtonClickListener"); } super.onAttach(activity); }
3.注册Button的Click事件,并在事件中调用回调方法。
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { Log.v(TAG, "Fragment1 onCreateView"); View view = inflater.inflate(R.layout.fragment1, container, false); // 为button注册事件,并且调用回调接口,将信息返回给上层 view.findViewById(R.id.fragment1_btn).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mListener.onButtonClicked(); } }); return view; }
然后,Activity的代码要实现:
1.通过implements实现回调接口;
public class MainActivity extends FragmentActivity implements OnButtonClickListener{
2.重写回调方法,然后向Fragment2传递数据。
@Override public void onButtonClicked() { Log.i(TAG, "onButtonClicked"); TextView tv = (TextView) fragment2.getActivity().findViewById(R.id.fragment2_tv); tv.setText(tv.getText() + "\n从Fragment1收到数据!"); }