回调方法,正如您所说的那样,就像在 Java 或 Android 的许多部分中发现的 Listener 接口一样简单。如果您想了解非常笼统的描述,您可以查看Observer pattern。但如果您已经了解如何使用 Listener,您将很容易理解回调。
注意:请勿将其与 Callback term 混合使用 - 它们不一样。
假设我们有Activity MyActivity 和Fragment MyFragment。我们想将一些数据从 Fragment 发布到 Activity。然后让我们在 MyFragment 中创建一个接口:
public class MyFragment extends Fragment{
private PostDataCallback mCallback;//our Activity will implement this
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (PostDataCallback) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
public interface PostDataCallback{
public void onPostData(Object data);
}
/*
we trigger this method when we calculated
data or something like that and want to post it*/
public void onSomeEvent(Object data){
mCallback.onPostData(data);
}
}
我们的 MyActivity 将如下所示:
public class MyActivity extends Activity implements MyFragment.PostDataCallback{
private Object data;
@Override
protected void onCreate(Bundle savedInstanceState){
getFragmentManager().beginTransaction().add(R.id.some_container_id, new MyFragment(), "my fragment");
}
@Override
public void onPostData(Object data){
this.data = data;
//some operations
}
}
所以,MyFragment 对其回调的实现一无所知。但它知道,它可以在 PostDataCallback 的实例上调用方法 onPostData(Object o),该实例保存在变量 mCallback 中。
因此,当 MyFragment 触发 mCallback.onPostData(data) 时,MyActivity 得到结果。
如果我们想将消息从 MyActivity 发送到 MyFragment,则完全相同的方法会起作用,但反之亦然:触发方法,回调接口定义和实例将驻留在 MyActivity 中,MyFragment 将实现接口。