onActivityResult中的requestCode错误

Dim*_*oid 291 android android-fragments onactivityresult

我正在从片段中开始一个新的活动

startActivityForResult(intent, 1);
Run Code Online (Sandbox Code Playgroud)

并希望在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
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我从来没有得到requestCode我刚刚发布的内容startActivityForResult().

我有一个类似的东西0x40001,0x20001有一个随机的高位设置.文档没有说明这一点.有任何想法吗?

Cha*_*Yao 785

你在打电话startActivityForResult()给你Fragment.当你这样做时,requestCodeActivity拥有者改变Fragment.

如果您想resultCode在活动中获得正确的信息,请尝试以下方法:

更改:

startActivityForResult(intent, 1);
Run Code Online (Sandbox Code Playgroud)

至:

getActivity().startActivityForResult(intent, 1);
Run Code Online (Sandbox Code Playgroud)

  • 因为它应该决定将结果传递给哪个片段.所以当The Fragment调用StartActivityForResult时.requestCode将被Activity更改,因此它将知道如何将结果传递给哪个片段.如果你真的想在Activiy中得到结果.只需调用getActivity().startActivityForResult(). (41认同)
  • 请注意:如果在片段中使用`startActivityForResult`并期望该片段中的`onActivityResult`结果,请确保在主机活动中调用`super.onActivityResult`(如果您在那里覆盖该方法).这是因为活动的`onActivityResult`似乎调用了片段的`onActivityResult`.另请注意,请求代码在通过活动的"onActivityResult"传播时会被更改,如Dimanoid在下面的答案中所述的链接中所述.你可能不需要知道,但你永远不知道...... (30认同)
  • "requestCode被拥有Fragment的Activity改变了" - 得热爱Android设计...... (30认同)
  • 这样一个重要的信息,你在文档中找不到任何明确的信息.一定要喜欢设计让你的生活变得地狱的机器人设计. (12认同)
  • 男人我爱你,我花了很多天试图理解这个问题并修复错误,谢谢! (2认同)
  • 当我调用 getActivity().startActivityResult() -> 请求代码已到来但未在片段中调用 onActivityResult() 时,仅调用活动方法 (2认同)
  • 8 年过去了,答案仍然有效!谢谢你! (2认同)

Ash*_*rma 32

请求代码没有错.使用v4支持库片段时,片段索引编码在请求代码的前16位中,而您的请求代码位于最后16位.片段索引稍后用于查找正确的片段以传递结果.

因此对于活动启动表单片段对象,处理onActivityResult requestCode如下:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)
Run Code Online (Sandbox Code Playgroud)


Jai*_*udo 17

更轻松:

int unmaskedRequestCode = requestCode & 0x0000ffff

检查低16位,只是取消屏蔽它进行逻辑AND,高16位归零

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为拥有Fragment的Activity更改了requestCode.见Ashlesha Sharma回答 (2认同)

Nil*_*ari 6

如果你提供不断的公开然后使用 startActivityResult

例:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)