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,也可以没有
    }

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);
        }
结语

各位看官如果有何其它不同的观点或建议,希望大家可以在下面留言讨论。

你可能感兴趣的:(Fragment回调Activity)