【问题标题】:onActivityResult method not being called AndroidonActivityResult 方法未被调用 Android
【发布时间】:2013-03-28 18:22:42
【问题描述】:

我正在尝试将数据从子活动发送到父活动。但不知何故, 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() 后无法正常工作
  • 尝试在onActivityResult() 中添加一些System.out.println() 以查看实际执行的代码。缩小范围后,您应该能够找出问题所在。如果没有,请编辑您的帖子并告诉我们正在执行哪些行。
  • 所以当我在父活动上调用触摸事件时..它进入 onTouch() 并且当它执行 startActivityForResult(intent, 1) 行时,它进入 onActivityResult() 请求代码为 1 . 之后它跳转到 Child Activity 并加载它。从 ChildActivity.OnItemClick() 中选择值后..它完成子活动但永远不会返回到父活动的 onActivityResult()。希望清楚
  • 所以,澄清一下,您尝试将println() 放在onActivityResult()非常顶部 中,但什么也没发生?因为我认为正在发生的是 onActivityResult() 实际上正在被调用,但是 switch 语句或 if 语句之一正在阻止您的代码执行。
  • 是的 onActivityResult() 在 ParentActivity 正在执行时被调用。它转到 switch (requestCode) { case 1: 但从未进入 if (resultCode == RESULT_OK) {} 块。因为 child 还没有被调用。据我了解,当子活动设置数据时,将调用此方法。但是,当我完成 ChildAcitivity 时,它再也没有被调用过。

标签: android android-activity


【解决方案1】:

对于遇到相同问题的任何人,没有收到onActivityResult 的症状,以下情况可能会导致此问题。

  • 检查您是否正确使用startActivityForResult(),不要使用startActivity()
  • 如果你在重写的onBackPressed 方法中做某事,super.onBackPressed(); 必须位于方法的最后,而不是第一行。 (我的案子要花 5 个小时)
  • 删除清单或等效参数中的 android:launchMode="singleInstance" 以创建意图。
  • 删除被调用者活动清单中的noHistory="true"
  • 检查setResult() 是否丢失。
  • 调用finish() 以关闭活动。使用finishActivity() 关闭被调用者活动。
  • 使用requestCode 大于零。负值不起作用。

【讨论】:

  • 我的情况是设置被调用的活动“android:launchMode="singleTask"”,删除它是有效的:)
  • 请注意,super.onBackPressed() 不是强制性的。默认情况下,您会返回到后台堆栈上的最后一个 Activity,但您可以完全替换该行为。
  • 负值有什么问题。我想为我创建的活动分配正请求代码,为 Android 和其他 SDK 的活动部分分配负请求代码。由于否定请求代码,它未能调用回调。谷歌提供了理由吗?
  • 负值不​​起作用应该有自己的赞成票。顺便说一句,在android文档的任何地方都提到过?
  • @somedev 是的,在the docs中有提到
【解决方案2】:

我发现了错误。我在 manifest.xml 中有以下行用于儿童活动。

        android:launchMode="singleInstance"

删除此行后。它就像一个魅力!

感谢大家的意见和建议。

【讨论】:

  • 我有单任务。将其更改为 singleTop 可以解决问题。
【解决方案3】:

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

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

替换静态引用是解决方法

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我正在使用 Intent intent = new Intent(Parents.this,Child.class); startActivityForResult(intent, 1);
    • 只有额外的部分父活动具有以下方法 @Override protected void onPause() { this.overridePendingTransition(R.anim.fade, R.anim.fade_right); this.overridePendingTransition(R.anim.right_in, R.anim.right_out);超级.onPause(); }
    • 我测试了你的代码,它在我这边运行良好。我能够从子活动传递数据并在 onActivityResult 中接收它。也许 selectedItemList 是空的?
    • 嗯...为什么它对我不起作用?我可以在 selectedItemList 变量中看到选定的值。
    • 不确定,但尝试在方法顶部调用:super.onActivityResult(requestCode, resultCode, data);
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      使用 singleTop 而不是 singleInstace 作为 launchMode,因为它在同一任务中维护活动。

      【讨论】:

        【解决方案7】:

        用于启动新 Avtivity 的意图不能使用标志 Intent.FLAG_ACTIVITY_NEW_TASK 设置,因为根据 android developer documentation

        当调用者从 正在启动的活动。

        【讨论】:

          【解决方案8】:

          onPause 正在影响 onActivityResult。

          其中一个极端情况可能是:
          我的情况不同而且很愚蠢:问题在于 onPause,finish 调用并结束活动。删除它并运行良好。

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

          【讨论】:

            【解决方案9】:

            删除主类中的OnActivityResult() 方法,它可以完美运行... MainActivity->>>>片段

            【讨论】:

              猜你喜欢
              • 2013-12-19
              • 1970-01-01
              • 1970-01-01
              • 2011-12-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-08
              相关资源
              最近更新 更多