image.png

Fragment与Activity的通信交互如上图所示:

  • 如果Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
  • 如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作
  • 在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

备注:

  • 如果在Fragment中需要Context,可以通过getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity.getApplicationContext();

考虑Fragment的重复使用问题,降低与Activity的耦合,Fragment操作应该由它的管理者Activity决定。

传递数据给Fragment

步骤流程:

  • 在Activity中创建Bundle数据包,调用Fragment实例的setArguments(),将Bundle数据包传给Fragment
  • Fragment调用getArguments()获得Bundle对象,然后进行解析就可以

简单示例:

1
2
3
4
5
//创建Fragment对象,并通过Bundle对象传递值(在onCreate方法中)
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("key", values);
fragment.setArguments(bundle);
1
2
3
4
5
6
7
8
//(在Fragment类中的onCreateView方法中)
Bundle bundle = this.getArguments();
if (bundle != null)
{
String str = bundle.getString("key");
}
TextView textView = new TextView(getActivity());
textView.setText("上上下下的享受");//是电梯,别误会

传递数据给Activity

步骤流程:

  1. 在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口
  2. Fragment通过回调接口传数据

简单示例:

首先在Fragment中定义一个接口(定义抽象方法,传什么类型参数)

1
2
3
4
/*接口*/  
public interface Mylistener{
public void thanks(String code);
}

Fragment类中定义该接口

1
private Mylistener listener;

在onAttach方法中,将定义的该接口强转为activity类型

1
2
3
4
5
6
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
listener=(Mylistener) activity;
super.onAttach(activity);
}

Activity只需实现该接口并重写该方法即可

1
2
3
4
5
@Override
public void thanks(String code) {
// TODO Auto-generated method stub
Toast.makeText(this, "已收到Fragment的消息:--"+code+"--,客气了", Toast.LENGTH_SHORT).show();;
}

除了接口回调,还可以使用EventBus进行交互通信。