【问题标题】:onActivityResult() not calledonActivityResult() 未调用
【发布时间】:2015-01-15 06:30:02
【问题描述】:

onActivityResult() 没有被调用。以下是我的代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to

    Log.e("CALLED", "OnActivity Result");

    if (requestCode == TEAM_SELECTED_REQUEST_CODE) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            try {
                 mySelectedTeam = getIntent().getStringExtra("teamName");
                txtSelectTeamCreateMatch.setText(mySelectedTeam);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

这是我开始SelectTeamActivity

Intent intent=new Intent(CreateMatch.this,SelectTeamActivity.class);
startActivityForResult(intent, TEAM_SELECTED_REQUEST_CODE);
//overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);

Intent intent = getIntent();
intent.putExtra("teamID", teamDataList.get(position).getTeamId().toString());
intent.putExtra("teamName", teamDataList.get(position).getTeamName().toString());
setResult(1, intent);

【问题讨论】:

    标签: android android-fragments onactivityresult


    【解决方案1】:

    选项 1:

    如果您从Fragment 调用startActivityForResult(),那么您应该调用startActivityForResult() 而不是getActivity().startActivityForResult(),因为这将导致FragmentonActivityResult()

    如果您不确定在哪里调用 startActivityForResult() 以及如何调用方法。

    选项 2:

    由于Activity 得到onActivityResult() 的结果,您将需要覆盖ActivityonActivityResult() 并调用super.onActivityResult() 以传播到相应的Fragment 以获取未处理的结果代码或全部。

    如果以上2个选项都不起作用,那么请参考选项3,因为它肯定会起作用。

    选项 3:

    FragmentonActivityResult()函数的显式调用如下

    在父 Activity 类中,覆盖 onActivityResult() 甚至覆盖 Fragment 类中的相同并调用如下代码。

    在父类中:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
        fragment.onActivityResult(requestCode, resultCode, data);
    }
    

    在子类中:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       //in fragment class callback
    }
    

    【讨论】:

    • 如果您对我的回答满意,可以接受吗?
    • @AkashMoradiya,如果所有 3 个都不起作用怎么办?当我使用GoogleSignIn 时,第二个有效,但在我创建意图时没有一个有效。这发生在同一个片段中(GoogleSignIn 有效,但不是意图)。我覆盖了父 Activity 函数和片段的函数
    • 对我不起作用。尝试了选项 1 和选项 2。
    【解决方案2】:

    onActivityResult 调用但使用错误的意图引用从结果意图中获取数据:

    getIntent().getStringExtra("teamName")
    

    用这个替换:

    data.getStringExtra("teamName")
    

    这里的数据是结果意图。

    【讨论】:

      【解决方案3】:

      我有同样的问题。我的呼叫活动是“singleInstance”。删除它解决了我的问题。

      【讨论】:

      • 谢谢你,你太棒了!它在不同的 API 级别上的行为也不同。 KitKat 不喜欢我的结果活动是单实例,但 Android N 根本不介意。真奇怪。
      • @ClarenceLeung 答案基本上是什么。不要将其设为singleInstance,而是将其设为singleTopstandard
      • 对我不起作用,因为我的活动是 singleTask。删除它也解决了我的问题。
      • 谢谢,伙计!自 Android M 以来,它似乎不适用于 singleInstance
      • 它不能与singleInstance 一起工作,因为它启动了一个新任务并且在其中没有活动可以返回
      【解决方案4】:

      我刚刚遇到了同样的问题,我很惊讶我看过的解决方案都没有提到以下内容:

      常量RESULT_OK 的值为-1,如果在setResult 方法中给出1 的值,那么resultcode 将不等于RESULT_OK 并且条件不会被处理。 我希望有人觉得这很有帮助。

      【讨论】:

      • 非常感谢,这正是我的问题。
      • 嗯,我们一般都叫setResult(Activity.RESULT_OK, data),很难面对这种情况。
      【解决方案5】:

      我通过从AndroidManifest.xml 中删除android:noHistory="true" 解决了我的问题。

      【讨论】:

      • AndroidManifest.xml 中我什至没有 android:noHistory="true"
      【解决方案6】:

      我遇到了同样的问题,我通过将这些参数添加到活动中解决了这个问题:

      AlwaysRetainTaskState = true, LaunchMode = Android.Content.PM.LaunchMode.SingleTop
      

      【讨论】:

        【解决方案7】:

        我遇到了类似的问题,我的问题是关于 requestCode 参数,该参数在 startActivityForResult 方法中设置为 -1。 因此,当我将 requestCode 值更改为 1 或 0 时,onActivityResult 开始被调用。

        【讨论】:

        • 谢谢;这正是我的问题。文档对此真的不清楚;他们说“requestCode: int: If >= 0, this code will be returned in onActivityResult() when the activity exits" - 为此我故意将requestCode设置为-1,因为我不需要它被返回到onActivityResult,但实际上onActivityResult 在这种情况下甚至没有被调用,这在文档中真的不清楚
        【解决方案8】:

        参考@spgodara 的回答后。

        我的SecondActivity 课程低于AndroidManifest.xml

        <activity android:name=".SecondActivity"
                    android:launchMode="singleTask"
                    android:screenOrientation="portrait"
                    android:theme="@style/AppThemeHome"
                android:windowSoftInputMode="adjustResize"/>
        

        我放了简单的Toast 来查找何时调用MainActivity 的回调onActivityResult。我发现这只是在创建SecondActivity 时调用(在打开SecondActivity 时)。 在带有 Marshmallow 的 Redmi Note 3 设备上运行良好但在 Kitkat 设备上运行不正常

        从上面提到的AndroidManifest.xml减速中删除以下行后:

        android:launchMode="singleTask"
        

        并且像下面这样调用意图对我有用:

         Intent intent = new Intent(this, SecondActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
        

        【讨论】:

          【解决方案9】:

          删除了这条线,它的工作正常。

          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          

          感谢提示。

          【讨论】:

          【解决方案10】:

          查看 pradip tilala 的 answer 后,我通过从 AndroidManifest.xml 中删除以下行解决了我的问题

          android:noHistory="true"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-10
            • 1970-01-01
            • 2020-10-02
            • 2011-09-03
            • 2019-12-05
            • 2012-10-14
            相关资源
            最近更新 更多