有时候我们需要Fragment和Activity进行通信,说白了,就是将Activity的值传入Fragment或者将Fragment中的值传入Activity。从Activity将数据传入Fragment,可以通过一下代码实现,假设WorkerChoose是我们的一个Fragment:
public static WorkerChoose newInstance(String workersOrder) {
WorkerChoose fragment = new WorkerChoose();
Bundle args = new Bundle();
args.putString(WORKERS_ORDER, workersOrder);
fragment.setArguments(args);
return fragment;
}
也就是说我们通过调用
fragment.setArguments(args); 来实现数据传入,在onCreate()方法中获取传入的数据:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
workersOrder = getArguments().getString(WORKERS_ORDER);
}
}
那么如何将Fragment中的数据传入Activity中哪?首先我们需要定义个接口,比如这样:
public interface GetWorker {
public void onChoosen(GroupWorker mGroupWorker);
}
接口定义好了,我们需要在Fragment中实例化这个接口,而且在onAttach()方法中有一个强制类型转换:
public class WorkerChoose extends Fragment {
private GetWorker getWorker;
......
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
getWorker = (GetWorker) activity;
} catch (ClassCastException e) {
throw new ClassCastException(
activity.toString() + " must implementOnArticleSelectedListener");
}
}
}
如果activity没有实现接口,fragment会抛出 ClassCastException 异常。正常情形下,getWorker成员会保持一个到activity的GetWorker实现的引用,因此
WorkerChoose
可以通过调用在GetWorker接口中定义的方法分享事件给activity。这个地方是关键!
最后,在使用Fragment的Activity中实现该接口的相应方法,即可使Fragment中的数据传入Activity中!