如果我开始 activity 以获得片段的结果,我应该调用 activity 片段的结果还是 activity?
If I start activity for result from a fragment, should I call on activity result in the fragment or activity?
我不确定什么是正确的方法。我有一些呼吁采取行动以在不同的片段中产生结果。每个片段都应该有自己的 onActivityResult 吗?还是应该全部是 activity 的 onActivityResult 中的句柄?
您必须为通过 startActivityForResult
启动 activity 的每个 Fragment
实施 onActityResult
。
因此,每个片段都可以正确跟踪结果:activity 结果仅对请求它的片段有意义。
也是有原因的。
当你启动一个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
被触发时,您可以在主机 activity 上捕获结果。但是,在主机 activity 中,requestCode 不再是您发送的请求代码,而是 requestCode 在内部被 Android 更改:
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);
}
如您所见,您可以在主机 activity 上捕获 activity 结果。但是,请求代码不再是您设置的代码 (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
也是有原因的。特别是如果你有不同的片段开始不同的活动等。如果你总是开始相同的 activity,你可能会错误地认为你可以在任何你想要的地方实现 onActityResult
。然而,事实并非如此。
每个片段或 activity 都应该处理他们请求的 activity 结果。他们不应该处理其他实体的结果。您可以这样做,但这只会给您的代码增加不必要的复杂性。
当您开始 activity 获取片段的结果时,请记住不要使用 getActivity().startActivityForResult(),仅使用 startActivityForResult 并覆盖片段中的 onActivityResult 和 bam 你会得到回调.
这里有三种情况
从片段 开始一个 activity 而不使用 activity 上下文
- 从 activity
开始 activity
从嵌套片段
开始 activity
多么嵌套的片段?
A fragment embed into another fragment
为什么嵌套片段收不到onActivityResult()
回调?
检查这个 link
如何手动调用 onActivityResult()
到嵌套片段
勾选这个link
我不确定什么是正确的方法。我有一些呼吁采取行动以在不同的片段中产生结果。每个片段都应该有自己的 onActivityResult 吗?还是应该全部是 activity 的 onActivityResult 中的句柄?
您必须为通过 startActivityForResult
启动 activity 的每个 Fragment
实施 onActityResult
。
因此,每个片段都可以正确跟踪结果:activity 结果仅对请求它的片段有意义。
也是有原因的。
当你启动一个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
被触发时,您可以在主机 activity 上捕获结果。但是,在主机 activity 中,requestCode 不再是您发送的请求代码,而是 requestCode 在内部被 Android 更改:
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);
}
如您所见,您可以在主机 activity 上捕获 activity 结果。但是,请求代码不再是您设置的代码 (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
也是有原因的。特别是如果你有不同的片段开始不同的活动等。如果你总是开始相同的 activity,你可能会错误地认为你可以在任何你想要的地方实现 onActityResult
。然而,事实并非如此。
每个片段或 activity 都应该处理他们请求的 activity 结果。他们不应该处理其他实体的结果。您可以这样做,但这只会给您的代码增加不必要的复杂性。
当您开始 activity 获取片段的结果时,请记住不要使用 getActivity().startActivityForResult(),仅使用 startActivityForResult 并覆盖片段中的 onActivityResult 和 bam 你会得到回调.
这里有三种情况
从片段 开始一个 activity 而不使用 activity 上下文
- 从 activity 开始 activity
从嵌套片段
开始 activity多么嵌套的片段?
A fragment embed into another fragment
为什么嵌套片段收不到
onActivityResult()
回调?检查这个 link
如何手动调用
onActivityResult()
到嵌套片段勾选这个link