我不确定什么是正确的方法。我呼吁采取行动,导致产生不同的碎片。每个片段都应该有自己的onActivityResult吗?还是全部由活动的onActivityResult处理?
答案 0 :(得分:1)
您必须为通过onActityResult
启动活动的每个Fragment
实现startActivityForResult
。
因此,每个片段都可以正确跟踪结果:活动结果仅对请求它的片段有意义。
还有一个原因。
开始活动时,必须设置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);
}
如您所见,您可以在“主机”活动上捕获活动结果。但是,请求代码不再是您设置的代码(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
。但是,事实并非如此。
每个片段或活动都应处理他们请求的活动结果。他们不应该处理其他实体的结果。您可以这样做,但只会增加不必要的代码复杂性。
答案 1 :(得分:1)
当您为片段的结果启动活动时,请切记不要使用getActivity()。startActivityForResult(),仅使用startActivityForResult并覆盖片段和bam中的onActivityResult即可得到回调。
答案 2 :(得分:1)