onActivityResult()方法中的Intent数据始终为null。

33

有人能告诉我为什么Intent data总是为null吗?

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK) {
    if (requestCode == UPDATE_PROFILE_REQUEST_CODE) {

        if (data != null) {
            User user = (User) data.getExtras().getSerializable(USER_DATA_EXTRA);
            if (user != null) {
                notifyNeedUpdate(user);
            }
        } else {
            Log.e("Dev", "data is null");
        }

    }
}

}

这就是我如何设置结果:

setResult(RESULT_OK, getIntent().putExtra(ProfileActivity.USER_DATA_EXTRA, constructUser()));

constructUser() 只是创建我需要的一个对象。

我总是得到 Log.e("Dev", "data is null");


你在哪里等待结果?是你的另一个活动吗?还是在按下返回键时? - rcbevans
另一个活动是的。不,它不是在后退按钮上。 - Eugene
3个回答

42

在调用之前,请确保您的第二个活动尚未完成

setResult(RESULT_OK, getIntent().putExtra(ProfileActivity.USER_DATA_EXTRA, constructUser()));

即,在调用onPauseonStoponDestroyfinish等方法之前,您应该先调用setResult方法。


你确定在第二个活动结束之前调用了setResult吗? - Nermeen
是的,这是个问题,Activity在我设置结果之前就被关闭了。Nunu,能否请您更新一下答案,以便我可以接受它?顺便说一句,getIntent()很好用,您不需要构建一个新的Intent。谢谢! - Eugene
4
在执行 onBackPressed() 方法之前 - Egemen Hamutçu
我不确定,如果你从未有机会将结果设置为RESULT_OK。因为你怀疑这段代码可能没有执行,因为第二个活动(设置结果的活动)完成得太早了。那么在接收结果的活动中,他是如何通过RESULT_OK代码检查的呢?因为默认结果是RESULT_CANCELLED。 - Jai Pandit
1
我需要在onBackPressed()内部调用setResult()。为了使其工作,我需要在调用super.onBackPressed()之前调用setResult()。 - Devo
Android 真是太棘手了!! - Ton

28
Posting here as a possible answer though may not be your issue exactly.
Ensure your activity returning passes back something like this.
Intent returnIntent = new 
returnIntent.putExtra("result", app);
returnIntent.putExtra("element", element);
if (app.getStatus() == 2){
    returnIntent.putExtra("update", true);
    // Tell the parent that everything went okay
    setResult(Activity.RESULT_OK, returnIntent);
    Log.i(TAG, "Returning, Result Success");
} else {
    // Tell parent that nothing changed
    setResult(RESULT_CANCELED, returnIntent);
    Log.i(TAG, "Returning, Nothing changed");
}
finish();

我曾花了很长时间遭受返回空意图的煎熬。对我来说,这是因为在onBackPressed中,我在上面的代码之前调用了super.onBackPressed()。当我把它放在后面时,一切都运作得很好。如果停止/销毁被过早地调用,则无法传递意图。这可能是你的问题。


+1 对我帮助很大!在我的第二个活动中,我在onStop()中设置了setResult代码-这实际上可以使得onActivityResult在我的片段中截取到结果,但是意图(数据)总是为空,尽管requestCode匹配并且具有结果代码30。我将代码从onStop()移动到onBackPressed(),然后我成功获取了数据额外信息。 - Mark
resultCode 30 是什么? - Jai Pandit
谢谢。这节省了我很多时间。 - Pritam Sangani
这部分是我需要的:“对我来说,问题在于我在onBackPressed中在上面的代码之前调用了super.onBackPressed()。” - sham

-2

在结束调用的Activity时,必须向调用方Activity返回一些数据。


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