onActivityResult方法未被调用 Android

21

我正在尝试从子活动向父活动发送数据。但不知何故,onActivityResult(..)没有被调用。以下是代码

父活动

selectedText.setOnTouchListener(new OnTouchListener() {



    public boolean onTouch(View v, MotionEvent event) {
                    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                        Intent intent = new Intent(Parents.this,Child.class);
                        startActivityForResult(intent, 1);
                    }
                    return true;
                }
            });


        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    if (data.hasExtra("selText")) {
                        selectedText.setText(data.getExtras().getString(
                                "selText"));

                    }
                    break;
                }
            }

子活动:我能够在setResult()中看到所选的值被设置。但是在子活动完成后,它没有返回到父活动。

textListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int myItemInt,
                    long arg3) {
                selectedFromList =(String) (textListView.getItemAtPosition(myItemInt));
                Intent data = new Intent();
                data.putExtra("selText", selectedFromList);
                setResult(RESULT_OK,data);
                finish();
            }
        });

在子活动中尝试使用“Intent data = getIntent()”后,它没有起作用。 - Chintan
尝试在onActivityResult()中添加一些System.out.println(),以查看实际执行的代码。一旦缩小范围,您应该能够找出问题所在。如果不能,请编辑您的帖子并告诉我们正在执行哪些行。 - Don
当在父活动上调用触摸事件时,它会进入onTouch()方法。当执行startActivityForResult(intent, 1)代码行时,它会进入request code为1的onActivityResult()方法。之后,它跳转到子活动并加载它。在从ChildActivity.OnItemClick()中选择值后,它会结束子活动但不会返回到父活动的onActivityResult()方法。希望这很清楚。 - Chintan
所以,为了澄清,您尝试在onActivityResult()非常顶部放置一个println(),但什么也没有发生?因为我认为正在发生的是onActivityResult()实际上正在被调用,但是switch语句或其中一个if语句正在阻止您的代码执行。 - Don
是的,当ParentActivity正在执行时onActivityResult()被调用了。它进入switch (requestCode) { case 1:但从未进入if (resultCode == RESULT_OK) {} 块。因为子类尚未被调用。根据我的理解,当子活动设置数据时,将调用此方法。但是自从我完成ChildAcitivity以来,它再也没有被调用过。 - Chintan
我遇到这个问题是因为一个错误。我在调用startActivityForResult()之后立即调用了finish(),这导致我的调用方Activity未能接收到结果,因为它在启动其他Activity后就已经结束了。 - joao2fast4u
9个回答

93

对于任何遇到同样问题的人,一个不接收 onActivityResult 的症状,以下情况可能导致此问题。

  • 检查你是否正确使用了 startActivityForResult(),不要使用 startActivity()
  • 如果您在重载的 onBackPressed 方法中执行某些操作,则必须将 super.onBackPressed(); 放置在方法的最后而不是第一行。 (我就因为这个问题浪费了5个小时)
  • 从清单中删除 android:launchMode="singleInstance" 或等效的参数来创建一个 intent。
  • 从被调用 activity 的清单中删除 noHistory="true"
  • 检查是否遗漏了 setResult()
  • 调用 finish() 来关闭 activity。使用 finishActivity() 来关闭被调用的 activity。
  • 使用大于零的 requestCode。负值无效。

我的情况是设置了被调用的活动 "android:launchMode="singleTask" ",并且移除它就可以了 :) - bony
请注意,super.onBackPressed() 不是必需的。这是默认情况下返回到后退堆栈上的最后一个 Activity 的情况,但您可以完全替换该行为。 - Sunshinator
1
负值存在什么问题?我想将正值请求代码分配给我创建的活动,并将负值请求代码分配给Android和其他SDK中的活动部分。由于一个负的请求代码,它无法调用回调函数。Google是否提供了任何解释? - Rajan Prasad
负值不起作用应该有自己的赞同。顺便问一下,这在Android文档中有提到吗? - somedev
1
@somedev 是的,在文档中有提到。 - Vadim Kotov
显示剩余4条评论

12

我找到了错误。我的manifest.xml中的子活动(child activity)代码中有以下这行:

        android:launchMode="singleInstance"

删除了这行代码之后,它的表现就像一件魔法般的事情!!!

非常感谢大家的建议和贡献。


1
我原本使用了 singletask 模式,但将其改为 singleTop 模式后问题得以解决。 - Swapnil Chaudhari

2

我的情况有点复杂,我意识到我错误地使用了指向子活动中第一个按钮监听器实例的静态引用。

在第一次转换时它是可以工作的,但是当用户从父活动返回时,onActivityResult没有被调用。

替换静态引用就是解决方法。


1

使用启动新Activity的Intent时,不能设置标志 Intent.FLAG_ACTIVITY_NEW_TASK,因为根据android开发者文档

当调用方正在请求从被启动的Activity返回结果时,不能使用此标志。


1
使用 singleTop 代替 singleInstance 作为 launchMode,因为它会将活动保留在同一任务中。

1

不确定是否适用于您的情况,但在启动子活动时,请确保使用startActivityForResult(intent)而不是startActivity();


我正在使用 Intent intent = new Intent(Parents.this,Child.class); startActivityForResult(intent, 1); - Chintan
我测试了你的代码,在我的环境下运行良好。我能够从子活动中传递数据,并在onActivityResult中接收它。也许selectedItemList是空的? - Andy Res
嗯...为什么在我的电脑上不起作用?我可以看到selectedItemList变量中的选定值。 - Chintan
不确定,但是尝试在方法顶部调用:super.onActivityResult(requestCode, resultCode, data); - Andy Res
我也试过了,还是不行。我不知道是什么原因导致的问题。 - Chintan
显示剩余2条评论

1
将调用活动的清单从 android:launchMode="singleInstance" 更改为 android:launchMode="singleTop",问题得到了解决。

0

onPause 影响了 onActivityResult。

其中一个边缘情况可能是:
我的情况很不同,也很愚蠢:问题在于 onPause 中调用了 finish 结束了该活动。去掉它后就可以正常工作了。

@Override
protected void onPause() {
    super.onPause();
    finish(); // this line causing the issue removed it. 
}

-2

在主类中删除OnActivityResult()方法,它可以完美地工作... MainActivity->>>>Fragments


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接