之前我们讲过两种Activity和Fragment通信的方式。一种是通过Bundle将对应的值以<key,value>的形式传递给Fragment。另一种是Activity和Fragment互相调用对方的方法。今天我再介绍一种方法,那就是接口回调。关于这个,我思考了很多。因为感觉接口回调的方法和直接调用Activity的方法没有什么差别 。但是仔细一想,如果多个Activity复用了该Fragment,接口回调就可以有不同的实现方式。比如这个Fragment中有一个按钮,依赖在ActivityA时,点击按钮可以是弹框。而当Fragment依赖在ActivityB时,就可以是跳转页面或请求接口。这种效果是用前两个都不太好实现的。虽然我们也可以在Activity中写同名的方法,但这个情况下我们必须写这个方法,不管我们是否需要这个功能,耦合度大大增加了。而接口的话我们可以不进行实现。说了这么多,现在我把Activity和Fragment通过接口回调方法交互的案例带给大家。
1.在Fragment中定义一个接口内部类
public interface FragmentListener{
void process(String str);
}
2.在Fragment中要定义该接口对象
private FragmentListener listener;
3.在Fragment的onAttach方法中接收实现类
@Override
public void onAttach(@NonNull Activity activity) {
super.onAttach(activity);
if (activity instanceof FragmentListener){
listener = (FragmentListener) activity;
}else{
throw new IllegalArgumentException("activity must implements Fragment interface");
}
}
4.在Activity中实现接口,并重写process方法,写入相应的逻辑
5.在Fragment中,具体要调用传值的位置调用接口方法
listener.process("我是接口");
此时Activity就可以接收到传入的值
6.最后在Fragment的onDetach方法中对接口对象清空
listener = null;
这样就完成了接口回调的整个步骤。第3步我们也可以使用更加灵活的做法,比如在Fragment中创建一个方法,为listener赋值,将接口的实现类传入进来。
这就是接口回调进行Activity和Fragment通讯的所有步骤。