onActivityResult() 方法未被调用。

36

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);
10个回答

88

选项1:

如果您从Fragment调用 startActivityForResult() ,则应该调用startActivityForResult()而不是getActivity().startActivityForResult(),以便在FragmentonActivityResult()中接收结果。

如果您不确定在哪里调用startActivityForResult()或如何调用方法,请参考以下第二个选项。

选项2:

由于Activity获得了onActivityResult()的结果,您需要覆盖ActivityonActivityResult()并调用super.onActivityResult()将其传递给未处理的结果代码或所有相关的Fragment

如果以上2个选项都无效,则参考选项3,因为它绝对有效。

选项3:

Fragment中显式调用onActivityResult()函数,如下所示:

在父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
}

4
如果你对我的回答满意,能否请您接受它? - Akash Moradiya
@AkashMoradiya,如果这三个方法都不起作用怎么办? 当我使用“GoogleSignIn”时,第二种方法有效,但是当我创建意图时,没有一个方法有效。这在同一片段内发生(GoogleSignIn有效,但意图无效)。我重写了父Activity函数和片段的函数。 - Kiura
对我没用。尝试了选项1和选项2。 - Qiang Zhang

17

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


1
我在AndroidManifest.xml文件中甚至没有android:noHistory="true"。 - Qiang Zhang

8

我遇到了同样的问题。我的调用活动是“singleInstance”。移除它解决了我的问题。


1
谢谢,你太棒了!它在不同的API级别上的行为也不同。KitKat不喜欢我的结果活动是singleInstance,但Android N却一点也不介意。真的很奇怪。 - Aleks N.
1
@ClarenceLeung 基本上答案已经说得很清楚了。不要使用 singleInstance,而是使用 singleTopstandard - Aleks N.
因为我的活动是“singleTask”,所以它对我不起作用。删除它也解决了我的问题。 - shoe
谢谢,伙计!看起来自 Android M 以来,它似乎无法与 singleInstance 一起使用。 - Daniels Šatcs
它无法使用singleInstance,因为它会启动一个新的任务,在其中没有活动可以返回。 - NikkyD

7

onActivityResult()被调用,但是使用了错误的意图引用来获取结果意图中的数据:

getIntent().getStringExtra("teamName")

请替换为以下内容:

data.getStringExtra("teamName")

这里的数据是意图的结果。

6

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


谢谢,这正是我的问题。文档在这方面真的不清楚;它们说:“requestCode:int:如果>= 0,则当活动退出时,此代码将在onActivityResult()中返回”-因此我故意将requestCode设置为-1,因为我不需要它返回到onActivityResult,但实际上,在这种情况下,onActivityResult甚至没有被调用,这从文档中看不出来。 - Adam Burley

4

我曾遇到过同样的问题,但令我惊讶的是我查看的解决方案中都没有提到以下内容:

常量RESULT_OK的值为-1,如果在方法setResult中给定值1,则结果码(resultcode)将不等于RESULT_OK,从而导致该条件无法被执行。希望这对某些人有所帮助。


非常感谢,正是我的问题。 - VIX
嗯,我们通常称之为 setResult(Activity.RESULT_OK, data),所以很少会遇到这种情况。 - CoolMind

2

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

android:noHistory="true"

1

我曾经遇到过同样的问题,通过在活动中添加以下参数解决了这个问题:

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

1

参考@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"

and calling intent like below worked for me:

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

1

删除了这行代码,现在程序可以正常运行。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

感谢提示。

这是程序开发相关的内容,需要从英语翻译成中文。请返回翻译好的文本:这应该是答案。在https://github.com/zhangtemplar/SMSForward中验证。 - Qiang Zhang

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