onActivityResult中的requestCode错误


310

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

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等等。文档对此无话可说。有任何想法吗?


Answers:


837

您正在startActivityForResult()从拨打电话Fragment。执行此操作时,会requestCodeActivity拥有的更改Fragment

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

更改:

startActivityForResult(intent, 1);

至:

getActivity().startActivityForResult(intent, 1);

44
因为它应该决定哪个片段将结果传递给。因此,当Fragment调用StartActivityForResult时。Activity将更改requestCode,因此它将知道如何将结果传递到哪个片段。如果您真的想在Activiy中获得结果。只需调用getActivity()。startActivityForResult()。
姚昌伟2012年

31
请注意:如果startActivityForResult在一个片段中使用并期望该片段中的结果onActivityResult,则只需确保调用super.onActivityResulthost活动(以防在此重写该方法)。这是因为该活动onActivityResult似乎称为片段的onActivityResult。另外,请注意,请求代码在通过活动的时onActivityResult,将按照Dimanoid在其回答中的链接中的说明进行更改。您可能不需要知道,但您永远不知道...
Ferran Maylinch 2014年

31
“ requestCode由拥有Fragment的Activity进行了更改”-一定喜欢Android设计...
Tiago

13
如此重要的信息,使您无法在文档中找到任何清晰的地方。一定会喜欢旨在使您的生活变得地狱的android设计。
Driss Bounouar,2016年

2
老兄,我爱你,我花了很多天试图理解这个问题并解决错误,谢谢!
tinyCoder

35

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

因此,对于从表格片段对象开始的活动,请按以下方式处理onActivityResult requestCode:

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

1
很好的信息,解释了此问题的确切原因
Muzikant 2016年

快速问题:什么是indexOfFragment?
路易·蔡

indexOfFragment是getSupportFragmentManager()。getFragments()生成的索引
HerberthObregon

25

更轻松:

Java的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

    }
}

1
您能告诉我为什么不给出原始请求代码的原因吗?
K.Sopheak

3
导致requestCode由拥有Fragment的Activity更改。看到Ashlesha Sharma的回答
Jaime Agudo

谢谢,这是我一直在寻找的答案。我不明白为什么Android不应该返回原始请求代码。
tonisives

今天,这对我非常有帮助,并且可以很好地说明问题。谢谢!
比利·拉扎罗

6

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

例:

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

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


0

在片段中

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

在主要活动中:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.