Fragment回调Activity
应用场景
如果你需要在fragment中处理一些事情,事情的处理结果或者你需要告 诉activity马上要做什么事,这时候就需要和activity进行通讯。包括很多fragment在viewpager中的情况,而且可以保证activity能即时进行响应。相比发送广播,性能更好,代码更少。
实战
假设有这样一个需求:在一个activity中有一个viewpager,viewpager里面有几个fragment,其中的一个fragment里面有一个任务,这个任务做完之后需要跳转到其他的fragment。
分析
既然需要跳转的到的fragment在viewpager里,那么只要控制viewpager跳转就可以了,而viewpager在activity里,我们是不是可以告诉activity一声让它处理一下就可以了呢?
步骤
1.定义回调
public interface OnFinishListener{
void onSuccess(int position);
//这里可以定义参数传给activity,也可以没有
}
【Fragment回调Activity】2.实现接口
让activity实现这个接口:
public class DemoActivity extends AppCompatActivity implements DemoFragment.OnFinishListener
这里需要在回调中让viewpager切换页面,所以:
@Override
public void onSuccess(int position) {
viewpager.setCurrentItem(position);
}
3.获取实例(关键部分)
首先定义一个全局变量
private OnFinishListener listener;
然后重写fragment的
onAttach(Context context)
方法:@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (OnFinishListener) context;
} catch (Exception e) {
e.printStackTrace();
}
}
由于
onAttach(Activity activity)
这个方法已经被标记过时,这里推荐用onAttach(Context context)
来给全局变量listener
赋值注意:这里这个方法的注释为
/**
* Called when a fragment is first attached to its context.
* {@link #onCreate(Bundle)} will be called after this.
*/
意思是这个方法只有在第一次附着在activity上时被调用,而且是在
onCreate(Bundle)
方法前调用,所以理论上也可以在onCreate(Bundle)
中回调该Activity
。4.根据业务进行回调
这里我们只需要在需要
Activity
切换fragment的地方调用if (listener != null) {
listener.onSuccess(1);
}
结语 各位看官如果有何其它不同的观点或建议,希望大家可以在下面留言讨论。
推荐阅读
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- 【迅动股票】强势股开始回调,降低仓位等待回踩
- Android基础-Fragment
- 异步回调函数传值问题
- Android|Android - 学习笔记四-Activity生命周期
- startActivity启动流程的源码学习
- Objective-C回调
- Unable|Unable to add window -- token null is not valid; is your activity running?
- Android黑科技(如何启动未注册的Activity)
- 为BFE编写扩展插件(1)|为BFE编写扩展插件(1) – 回调点