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

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

    推荐阅读