您必须为通过startActivityForResult 启动活动的每个Fragment 实现onActityResult。
因此,每个片段都可以正确跟踪结果:活动结果仅对请求它的片段有意义。
这也是有原因的。
当你开始一个activity时,你必须设置一个requestCode:
// Note the request code: 0
startActivityForResult(0, new Intent(...))
但是,如果您从 Fragment 内部调用该方法,Android 将在内部更改请求代码(因此它可以自动跟踪触发请求的片段)。
这是因为Fragment 的主机是FragmentActivity 而不是简单的Activity
// From FragmentActivity
// Note how the request Code is overriden ((requestIndex + 1) << 16) + (requestCode & 0xffff)
startActivityFromFragment(...) {
startActivityForResult(this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
}
因此,当onActivityResult 被触发时,您可以在主机活动上捕获结果。但是,在宿主活动中,requestCode 不再是您发送的,而是 Android 内部更改的 requestCode:
In host activity:
@Override
protected void onActivityResult(final int requestCode, final int resultCode,
@Nullable final Intent data) {
// This print 65536
Log.v("TEST", "onActivityResult: " + requestCode);
super.onActivityResult(requestCode, resultCode, data);
}
如您所见,您可以在 Host 活动上捕获活动结果。但是,请求代码不再是您设置的那个(0)。因此,在这里,您无法跟踪请求代码。因此,您无法追踪此结果的来源。
Android 将在您的片段中调用onActivityResult。但是,在调用片段之前,请求代码会转换回您发送的值 (0):
// From FragmentActivity
// Note how the request Code is converted back to 0
onActivityResult(....) {
// Android will call your fragment with the correct requestCode
targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
}
//In your fragment:
@Override
protected void onActivityResult(final int requestCode, final int resultCode,
@Nullable final Intent data) {
// This print 0. So, now, you know this is the result of the request 0
Log.v("TEST", "onActivityResult: " + requestCode);
}
因此,在您的片段中实现onActivityResult 也是有原因的。特别是如果你有不同的片段开始不同的活动等。如果你总是开始相同的活动,你可能会错误地认为你可以在任何你想要的地方实现onActityResult。然而,事实并非如此。
每个片段或活动都应该处理他们请求的活动结果。他们不应该处理其他实体的结果。你可以这样做,但这只会给你的代码增加不必要的复杂性。