348

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

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
    }
}

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

我得到了类似的东西0x400010x20001设置了随机的更高位。文档对此只字未提。有任何想法吗?

4

6 回答 6

904

您正在startActivityForResult()从您的Fragment. 执行此操作时,拥有 的requestCode会更改。ActivityFragment

如果你想resultCode在你的活动中得到正确的,试试这个:

改变:

startActivityForResult(intent, 1);

到:

getActivity().startActivityForResult(intent, 1);
于 2012-05-12T14:13:31.563 回答
44

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

因此,对于从片段对象开始的活动,处理 onActivityResult 请求代码如下:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)
于 2016-06-15T13:20:57.593 回答
38

更轻松:

爪哇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

    }
}
于 2017-03-09T17:57:03.963 回答
6

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

例子:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
于 2016-02-26T21:22:05.800 回答
2

您也可以
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);
    }
}

startActivityForResult(intent, requestCode)在你的内部调用Fragment

于 2016-08-06T13:52:08.917 回答
0

在片段中

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

在主要活动中:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
于 2018-02-15T13:34:52.833 回答