onActivityResult 中的 requestCode 错误
Posted
技术标签:
【中文标题】onActivityResult 中的 requestCode 错误【英文标题】:Wrong requestCode in onActivityResult 【发布时间】:2012-05-20 19:47:05 【问题描述】:我正在从我的 Fragment 开始一个新的活动
startActivityForResult(intent, 1);
并希望在 Fragment 的父 Activity 中处理结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1)
// bla bla bla
问题是我从来没有收到我刚刚发布到startActivityForResult()
的requestCode
。
我得到了类似0x40001
、0x20001
等的东西,其中设置了随机的高位。文档对此只字未提。有什么想法吗?
【问题讨论】:
onActivityResult not being called in Fragment 的可能重复项 【参考方案1】:您正在从您的Fragment
呼叫startActivityForResult()
。执行此操作时,requestCode
将由拥有 Fragment
的 Activity
更改。
如果你想在你的活动中获得正确的resultCode
,试试这个:
变化:
startActivityForResult(intent, 1);
收件人:
getActivity().startActivityForResult(intent, 1);
【讨论】:
因为它应该决定哪个片段将结果传递给 .所以当 Fragment 调用 StartActivityForResult 时。 requestCode 将被 Activity 更改,因此它会知道如何将结果传递到哪个 Fragment。如果你真的想在 Activiy 中得到结果。只需调用 getActivity().startActivityForResult()。 请注意:如果您在片段中使用startActivityForResult
并期望在该片段中来自onActivityResult
的结果,只需确保在主机活动中调用super.onActivityResult
(以防您覆盖那里的那个方法)。这是因为活动的onActivityResult
似乎调用了片段的onActivityResult
。另外,请注意,请求代码在通过活动的onActivityResult
时会按照 Dimanoid 在下面的答案中发布的链接中的说明进行更改。你可能不需要知道,但你永远不会知道......
"requestCode 被拥有 Fragment 的 Activity 更改" - 一定会喜欢 android 设计...
如此重要的信息,您在文档中找不到任何清楚的地方。一定会喜欢旨在让你的生活变得地狱般的安卓设计。
我爱你,我花了很多天试图理解这个问题并修复错误,谢谢!【参考方案2】:
请求代码没有错。使用 v4 支持库片段时,片段索引编码在请求代码的前 16 位中,您的请求代码在后 16 位中。片段索引稍后用于查找正确的片段以传递结果。
因此对于活动开始表单片段对象,处理 onActivityResult requestCode 如下:
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
【讨论】:
很好的信息解释了这个问题的确切原因 快速提问:什么是 indexOfFragment? indexOfFragment 是 getSupportFragmentManager().getFragments() 产生的索引 士气:不要混合活动/片段 startActivityForResult() 和 onActivityResult()。从活动开始时,在活动中处理结果。从片段开始时,在片段中处理结果。【参考方案3】:更简单:
Java:
int unmaskedRequestCode = requestCode & 0x0000ffff
科特林:
val unmaskedRequestCode = requestCode and 0x0000ffff
检查低 16 位,只需在高 16 位归零的情况下进行逻辑与运算即可取消屏蔽
protected void onActivityResult(int requestCode, int resultCode, Intent data)
final int unmaskedRequestCode = requestCode & 0x0000ffff
if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE)
//Do stuff
【讨论】:
你能告诉我为什么它没有给出原始请求代码的原因吗? 因为 requestCode 被拥有 Fragment 的 Activity 更改。见 Ashlesha Sharma 的回答 谢谢,这就是我要找的答案。我不明白为什么 Android 不应该返回原始请求代码。 今天这对我很有帮助,实际上很好地解释了这个问题。谢谢!【参考方案4】:如果您提供常量,请将其公开,然后在 startActivityResult
中使用
示例:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
【讨论】:
【参考方案5】:您也可以定义super.onActivityResult(requestCode, resultCode, data)
在Activity
(如果你覆盖onActivityResult
)
在这
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
switch (requestCode)
...
default:
super.onActivityResult(requestCode, resultCode, data);
并在您的Fragment
中调用startActivityForResult(intent, requestCode)
【讨论】:
【参考方案6】:在片段中
getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
在主要活动中:
if (requestCode == PLACE_PICKER_REQUEST)
if (resultCode == RESULT_OK)
//what ever you want to do
【讨论】:
以上是关于onActivityResult 中的 requestCode 错误的主要内容,如果未能解决你的问题,请参考以下文章
Fragment 中的 onActivityResult 从未调用过
onActivityResult 中的 requestCode 错误