resultCode始终为0,请求始终为-1。Activity.onActivityResult();

14

我想将这个问题添加到另一个有关 resultCode == 0requestCode == 0的问题列表中。

以下是概述: NoteActivity 使用startActivityForResult()调用 NoteSettingsActivity

我已经搜索了网上内容,发现当我按下返回按钮时,使用 super.onBackPressed()resultCode == 0。进一步研究后发现,无论何时按下后退按钮,它似乎都会返回此代码,但是在搞砸了 super.onBackPressed() 调用并仅简单地使用 finish() 应用程序后,onActivityResult()resultCode 仍然等于 0。对于requestCode也是同样情况。

此外,我尝试操作清单文件,但所做的许多更改都不能使它正常工作。

以下是摘录。请注意,我已恢复到以前的提交状态,因此我失去了最近的修改,但请查看我之前编写的代码,注意resultCode始终等于 0 (ACTIVITY_CANCELED)。

@Override
public void onNoteSettingsActivityCalled(Note note)
{
    Intent intent = new Intent(this, NoteSettingsActivity.class);
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_ID, note.getNoteID());

    startActivityForResult(intent, NoteRequest.REQUEST_UPDATE_SETTINGS);
}

这是当检测到返回按钮按下时的情况:

@Override
public void onBackPressed()
{   
    Log.i(NoteApplication.TAG, "NoteSettingsActivity.onBackPressed() has been called.");

    Intent intent = new Intent();
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_REMINDENABLED , mRemindEnabled);
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_REMINDEVERY   , mDaysSelected);
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_REMINDON      , String.valueOf(mRemindDateTime));
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_ID            , mTargetNoteID);

    if(getParent() != null)
        getParent().setResult(Activity.RESULT_OK, intent);
    else
        setResult(Activity.RESULT_OK, intent);

    super.onBackPressed();
}

这就是NoteActivity如何接收到返回的调用。

    @Override
public void onActivityResult(int result, int request, Intent intent)
{
    super.onActivityResult(result, request, intent);

    Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() has been called.");
    Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() result = " + result + " request = " + request);

    if(result == Activity.RESULT_CANCELED)
        return;

    switch(request)
    {
        case NoteRequest.REQUEST_UPDATE_SETTINGS:

            if(intent == null) return;

            int noteID = intent.getIntExtra(NoteExtrasKey.EXTRA_NOTE_ID, -1);
            String remindOnString = intent.getStringExtra(NoteExtrasKey.EXTRA_NOTE_REMINDON);

            if(remindOnString != null && !remindOnString.equals(""))
                mRemindDateTime = Timestamp.valueOf(remindOnString);

            mHasSettingsEnabled = true;
            mRemindEnabled = intent.getBooleanExtra(NoteExtrasKey.EXTRA_NOTE_REMINDENABLED, false);
            mSelectedDays = intent.getIntegerArrayListExtra(NoteExtrasKey.EXTRA_NOTE_REMINDEVERY);

            if(noteID < 0)
            {
                Note note = mNoteDatabaseHelper.getNote(noteID);
                note.setRemindEnabled(mRemindEnabled);
                note.remindEvery(mSelectedDays);
                note.remindOn(mRemindDateTime);

                onNoteItemUpdated(note); 
            }

            Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() NoteRequest.REQUEST_UPDATE_SETTINGS called.");

            break;

        default:
            Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() : unknown request code = " + request);
            break;
    }
}

当我运行时,resultCode等于0,requestCode等于-1。我已经检查了传递的意图,它不为空。

以下问题与此问题非常相关,但没有一个有效:

我花费了很多重要的时间在我的项目上,只是弄清楚什么导致了resultCode和requestCode的值在传递过程中丢失。

任何帮助和指导将不胜感激。非常感谢!


第二个Activity上有任何标志吗? - shkschneider
6个回答

29
在我的情况下,我因为两个原因得到了 resultCode == 0 的错误。 首先,我将方法从一个 fragment 中复制而不是从另一个 activity 中复制:

在我的情况下,我因为两个原因得到了 resultCode == 0 的错误。

首先,我将这个方法从一个 fragment 中复制而不是从另一个 activity 中复制:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

避免这种情况发生的一个好方法是使用@Override注解来重写你的方法,这样你就知道你正在覆盖默认的onActivityResult方法签名。

使用正确的方法签名:

public void onActivityResult(int requestCode, int resultCode, Intent data) {

其次,我正在做这件事:

    super.onBackPressed();
    Intent intent = new Intent();
    intent.putExtra(getString(R.string.like_count), people.size());
    Log.e(TAG, people.size() +" people ");
    setResult(RESULT_OK, intent);
    finish();

在实际设置resultCode之前,super.onBackPressed()设置了resultCode,因此导致了结果为0。

一个简单的修复可以使其正常工作:

    Intent intent = new Intent();
    intent.putExtra(getString(R.string.like_count), people.size());
    Log.e(TAG, people.size() +" people ");
    setResult(RESULT_OK, intent);
    super.onBackPressed();

使用 super.onBackPressed(); 可以节省我很多时间和精力.. :) - AndyBoy
我不确定是否记得正确,以前在Android Studio的旧版本中,我曾经信任过智能感知,而且我发誓它会将第一个参数标记为“resultCode”,然后是“requestCode”,所以可能是这个原因。 - Neon Warge
优美而简洁的答案 +1 - Erfan

4

正确的签名是:

public void onActivityResult(int requestCode, int resultCode, Intent data) {

您把请求和结果混淆了。

我只是有点累了。我本应该注意到的!非常感谢你!你救了我的命。 - Neon Warge
我没有混淆签名,但我一直在检查resultCode并认为我正在查看requestCode,希望这能帮助后来寻找答案的人。 - Dino Tw

4
调用 super.onBackPressed() 的语句最终会设置结果代码并将其发送回调用的活动。将该语句替换为调用 finish(),您应该可以获得所需的结果代码。
希望这能有所帮助!

在我发布的链接上,我做了类似的事情。但那并不起作用。 - Neon Warge
是的,确认过了,我已经按照建议尝试过了。结果也不行。我会尝试创建一个按钮并从那里设置结果,看看是否可以重现这个问题。 - Neon Warge
这里真的需要调用getParent()吗?如果NoteActivity是调用活动,而NoteSettingsActivity是被调用的活动,那么你可以直接调用setResult()而不是getParent().setResult(),然后调用finish()来终止NoteSettingsActivity。你试过了吗? - k3v1n4ud3
1
我个人一直使用setResult()然后finish(),这样就可以了。不要使用super.onBackPressed() - shkschneider
我也做过了。我在之前的提交中提到过。但那也不起作用。 - Neon Warge

1
在从设备中卸载应用程序时,我遇到了相同的问题。通过在执行startActivityForResult之前添加以下代码来解决该问题: intentObject.putExtra(Intent.EXTRA_RETURN_RESULT, true);

0

我知道我来晚了,但是:

我遇到了同样的问题,这是因为在设置结果之前,我调用了onBackPressedDispatcher.onBackPressed()

像这样:

override fun onBackPressed() {
    onBackPressedDispatcher.onBackPressed() // <---- PROBLEM
    val intent = Intent()
    intent.putExtra("KEY", "VALUE"))
    setResult(RESULT_OK, intent);
    // AND here I tried with this calls without luck. -> requireActivity().finish() or super.onBackPressed()
}

0

对于来自《Android大杂烩》一书的读者,你们的代码可能存在打字错误,请确保正确比较:

if (requestCode == REQUEST_CODE_CHEAT) {
if (RESULT_OK == resultCode) {...} 
...
}

提醒:RESULT_OK始终为-1,其存在意味着setResult()从子Activity中调用。


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