错误的请求在活动结果中编码



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

startActivityForResult(intent, 1);

并希望在片段的父活动中处理结果:

@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 等的东西,并设置了一个随机的更高位。文档对此没有说什么。有什么想法吗?

您正在从Fragment调用startActivityForResult()。执行此操作时,拥有FragmentActivity会更改requestCode

如果您想在活动中获取正确的resultCode,请尝试以下操作:

改变:

startActivityForResult(intent, 1);

自:

getActivity().startActivityForResult(intent, 1);

请求代码没有错。使用 v4 支持库片段时,片段索引编码在请求代码的前 16 位中,请求代码在底部 16 位中编码。稍后使用片段索引来查找正确的片段来提供结果。

因此,对于活动启动表单片段对象,处理活动结果请求代码,如下所示:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)

更容易:

爪哇int unmaskedRequestCode = requestCode & 0x0000ffff

科特林val unmaskedRequestCode = requestCode and 0x0000ffff

检查较低的 16 位

,只需在高 16 位归零的情况下执行逻辑 AND 取消屏蔽

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    final int unmaskedRequestCode = requestCode & 0x0000ffff
    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff
    }
}

如果您提供常量,请将其公开,然后在startActivityResult中使用

例:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);

您还可以定义

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)

in Fragment

  getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

在主要活动中:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }

最新更新