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

我得到了类似0x400010x20001 等的东西,其中设置了随机的高位。文档对此只字未提。有什么想法吗?

【问题讨论】:

onActivityResult not being called in Fragment 的可能重复项 【参考方案1】:

您正在从您的Fragment 呼叫startActivityForResult()。执行此操作时,requestCode 将由拥有 FragmentActivity 更改。

如果你想在你的活动中获得正确的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】:

更简单:

Javaint unmaskedRequestCode = requestCode &amp; 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 错误

片段中的Android onActivityResult

onActivityResult 中的非法状态异常

适配器类中的super.onActivityResult?安卓

Android - 片段的 onActivityResult() 中的 NPE