【问题标题】:Fragments startActivityForResult always return resultCode 0 and intent null on callback onActivityResult片段 startActivityForResult 始终返回 resultCode 0 并且在回调 onActivityResult 时意图为 null
【发布时间】:2013-08-29 13:23:52
【问题描述】:

我搜遍了,也有类似的帖子,但找不到解决办法!

我的情况是我有一个包含fragment 的活动 A,我想从该fragment 开始一个新的Activity B,它应该将一些值返回给fragment

fragment

startActivityForResult(mapIntent, ConstantsUtils.TOMAP_REQUEST_CODE);

ActivityB上,返回数据

Intent returnIntent = new Intent();
returnIntent.putExtra(SerializationConstants.isSearchSaved, mAbItemsShown.ordinal());
setResult (ConstantsUtils.SUCCESS_RETURN_CODE, returnIntent);
finish();

在片段上

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

switch (requestCode) {

    case ConstantsUtils.TOMAP_REQUEST_CODE:

            if (resultCode == ConstantsUtils.SUCCESS_RETURN_CODE) {
              //do some stuff 
            }
    }
}

fragment 中的onActivityResult 被成功调用,正确的requestCoderesultCode 始终为0,intent 始终为null

我在Activity A 下没有其他onActivityResult 实现。

事实上,我也尝试从 fragment 开始 activity getActivity().startActivityForResult(mapIntent, ConstantsUtils.TOMAP_REQUEST_CODE); 并在Activity A 上实现onActivityResult,但它发生相同,正确requestCode 但错误resultCodeintent

我使用的是Sherlock Action Bar,所以我的fragmentSherlockListFragment,所以我使用的是support library (r18)

你能帮帮我吗?谢谢

【问题讨论】:

  • 我不知道你的super.onActivityResult(requestCode, resultCode, intent); 是干什么用的。在我看来,没有必要。此外,您的 request_code 必须 >= 0,因为它提到 [here][doc][doc]:developer.android.com/reference/android/app/…, int)
  • super 不是必需的,我只是想看看问题是否是因为它,但如果我不说,结果相同。常量 SUCCESS_RETURN_CODE 的值为 1,但 Activity.RESULT_OK 也是如此
  • 看起来您在 ActivityB 的其他地方调用 finish()。在不设置结果代码和结果数据的情况下调用 finish() 将导致您所描述的行为。无论是那个还是 ActivityB 崩溃,都会做同样的事情。
  • 那么我必须建议你检查活动 A,在 onStart()onResume 部分。如果您创建一个名为startActivityForResult 的片段的新实例,这将是问题所在。正常情况下,当Activity B调用finish()时,Android会自动恢复之前的状态。所以我你手动创建另一个片段实例,它将替换获得返回 Intent 的那个。

标签: android android-intent android-fragments onactivityresult


【解决方案1】:

结果代码 0 是RESULT_CANCELLED

The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation.

此外,获取此代码的常见原因是在新任务中启动活动(检查您的意图和清单中的标志,这会导致新任务的开始)。

另外,如果你有一个父活动,你应该设置它的结果代码而不是设置它的孩子的结果代码(尝试getParent,如果它不为空,则设置它的结果代码)。

【讨论】:

  • 我检查过,清单中或创建意图时没有任何特殊标志。 ActivityB(执行setResult的那个)里面的getParent的值为null
  • 太棒了,谢谢。我的问题是我的清单中有 launchMode="singleTask"。
  • @elimirks 你能解释一下你是如何解决你的问题的吗?我需要launchMode="singleTask",但我仍然想开始一项新活动。
  • @mariosangiorgio singleTask 启动模式仅适用于独立活动。
【解决方案2】:

我花了一些时间找出原因。我的错误是把super.onBackPressed() 放在onBackPress() 方法中。

我在方法中调用了finish()。但我认为super.onBackPressed() 会自动调用finish(),所以你总是会得到resultCode 0。 因此,只需删除 onBackPressed() 方法中的 super.onBackPressed() 行。

【讨论】:

  • 我遇到了同样的问题,这条评论让我很安全!谢谢你:)
  • 你不需要删除super.onBackPressed(),只需将setResult()代码放在super.onBackPressed()之前
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多