从另一个 Activity 返回的错误 requestCode onActivityResult

Posted

技术标签:

【中文标题】从另一个 Activity 返回的错误 requestCode onActivityResult【英文标题】:Wrong requestCode returned onActivityResult from another Activity 【发布时间】:2015-01-29 06:15:02 【问题描述】:

我有一个Activity,它调用另一个Activity,它调用另一个Activities。 我发送到最后一个Activity得到结果,然后我将结果发送回拳头Activity

流程有点像

A -> B -> C -> D -> C -> B -> A

AD 的流由startActivityForResult 组成,从DA 的流由onActivityResult 组成。

DB requestCode 总是相同的(我决定的那个),但是从BA 它突然从我的值变为随机值(在这种特殊情况下196614)。

这是我用来从activity A 调用activity B 的代码:

filterByCatalogue.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent intent = new Intent(getActivity(), CatalogueContainerActivity.class);
            startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
        
    );

(将filterByCatalogue 用作FrameLayout

这是我用来回调activity A的代码:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Defines.FILTER_BY_CATALOGUE) 
            if (resultCode == RESULT_OK) 
                Intent intent = new Intent();
                intent.putExtra("article", data.getStringExtra("article"));
                setResult(RESULT_OK, intent);
                finish();
            
        
    

我已经搜索了很多,但我找不到哪里出错了......

【问题讨论】:

请显示您的活动 A 代码,从哪里开始活动 B 的意图 【参考方案1】:

请求代码不是随机的。使用 v4 支持库片段时,片段索引编码在请求代码的前 16 位中,您的请求代码在后 16 位中。片段索引稍后用于找到正确的片段来传递结果。 Reference.

例如,196614 实际上是 3

士气:不要混合活动/片段startActivityForResult()onActivityResult()。从活动开始时,在活动中处理结果。从片段开始时,在片段中处理结果。

【讨论】:

@VladimirIvanov 接受的答案已于 2014 年 12 月 1 日即很久以前被接受。由于 Nitesh 的编辑和赏金(这没有授予任何人 - 可能他试图赏金他自己的答案)而弹出问题时,我才发布了我的答案。【参考方案2】:

只需替换

startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);

getActivity().startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);

它肯定会起作用。 :)

【讨论】:

对我来说还不清楚为什么会这样。你能解释一下为什么这会解决问题吗? 该死的!我不知道为什么,但它有效!你能解释一下为什么吗? 我假设你是从一个片段开始这个意图..? 这里 getActivity() 返回当前活动的上下文而不是整个应用程序 @Luca 原因是来自Fragments 的请求代码在Activity.startActivityForResult() 实际发送之前已被修改,因此当Activity 收到结果时它会知道要发送哪个Fragment它到。例如,你得到的值 196614 是 0x30006,其中 6 应该是原始请求代码,0x30000 是框架插入的。

以上是关于从另一个 Activity 返回的错误 requestCode onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

从另一个活动返回后,VideoView 上的视频播放消失

从另一个 Activity 刷新 Recyclerview

从另一个活动返回后防止recyclerview重新加载

如果 setIconifiedByDefault 为 false,则从另一个意图返回时键盘弹出

在If case情况下从另一个中获取一个Activity

从另一个活动调用时为空侦听器