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

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等随机更高的位设置。医生对此只字未提。什么好主意吗?


当前回答

你从你的Fragment调用startActivityForResult()。当你这样做的时候,requestCode会被拥有片段的Activity改变。

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

变化:

startActivityForResult(intent, 1);

To:

getActivity().startActivityForResult(intent, 1);

其他回答

请求代码没有错。当使用v4支持库片段时,片段索引编码在请求代码的前16位,而您的请求代码编码在底部16位。片段索引稍后用于查找交付结果的正确片段。

因此,对于从片段对象开始的活动,处理onActivityResult requestCode如下所示:

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

如果你提供的是常量,将其设为public,然后在startActivityResult中使用

例子:

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

在片段

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

主要活动:

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

你从你的Fragment调用startActivityForResult()。当你这样做的时候,requestCode会被拥有片段的Activity改变。

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

变化:

startActivityForResult(intent, 1);

To:

getActivity().startActivityForResult(intent, 1);

简单:

Java: int unmaskedRequestCode = requestCode & 0x0000ffff

芬兰湾的科特林: val unmaskedRequestCode = requestCode和0x0000ffff

检查下16位,只是做一个逻辑和与上16位归零

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

    final int unmaskedRequestCode = requestCode & 0x0000ffff

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

    }
}