启动活动的结果码始终为0。

3

我正在尝试从活动2中获取编辑后的列表并返回到活动1。这是我的代码:

public void listDataSms(ArrayList<MySmsLog> stringList) {
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList(NUMBER_LIST, stringList);
    Intent i = new Intent(this, MyCommonListActivity.class);
    i.putExtra(WHO_INT, SMS_LOG);
    i.putExtras(bundle);
    startActivityForResult(i, SMS_LOG);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == SMS_LOG) {
        if (resultCode == RESULT_OK) {
            ArrayList<MySmsLog> mySmsLogs = (data.getParcelableArrayListExtra(PICK_SMS_LOG));
            mainLog.setSmsLog(mySmsLogs);
        } 

        if (resultCode == RESULT_CANCELED) {
            // do something if there is no result
        }
    }
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent();
    Bundle result = new Bundle();
    switch (who) {
        case SMS_LOG:
            result.putParcelableArrayList(MainActivity.PICK_SMS_LOG, mySmsLogList);
            break;
    }

    setResult(RESULT_OK, intent);
    intent.putExtras(result);
}

但是我从来没有得到 setSmsLog,因为 resultCode 总是 0。 我尝试了Android onActivityResult 总是 0,但没有结果。 即使我把条件改成 if (resultCode == RESULT_CANCELED) {do smth},程序也会以 NullPointerException 结束。


@bwegs 这是请求代码。@previ 你的 MyCommonListActivity 活动是如何终止的? - Aniket Thakur
2个回答

7
假设你所展示的代码中的 onBackPressed() 是来自于 MyCommonListActivity,那么在调用 setResult() 之前已经晚了。最好的做法是,在用户点击 ListView 中的某个项目或选择特定项目进行操作时立即调用 setResult()finish(),而不是等待用户按下返回键再进行调用。如果你把 super.onBackPressed() 放在最后一个调用,而不是第一个,你的代码可能会有所改善。

2
我使用了super.onBackPressed(),现在它可以工作了!我知道使用BACK键并不是一个好的解决方案,但不幸的是,在这个例子中我需要它。谢谢! 还有一个问题,为什么super.onBackPressed()应该是方法中的最后一件事? - previ
@previ:在调用 finish() 之前,您需要调用 setResult()onBackPressed() 的默认行为是调用 finish()。因此,您对 super.onBackPressed() 的调用会调用 finish(),在此之前您需要进行 setResult() - CommonsWare

1
尝试在 intent.putExtras(result); 之后加上 super.onBackPressed();。

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