Android的onActivityResult总是返回0

18
这个问题困扰我已经两天了。我有一个主Activity A,它调用第二个Activity B。Activity B中只是向用户呈现一个列表视图。当我点击列表视图中的项目时,我希望将一些字符串传回给主Activity A,并且Activity B将会被关闭。
问题是,我总是收到结果代码0和数据包为空的情况。我真的不明白为什么会发生这种情况。
以下是我的代码。
启动带有结果的Activity B:
Test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(recipeActivity.this, BrowseLoadRecipes.class);
            startActivityForResult(i, RECIPE_CHOOSER);
    }  
    });

这个可以成功启动第二个Activity。Activity B填充了一个列表视图,当我点击某一项时,我想将一些数据发送回调用的Activity A。

目前还没有任何文本内容,因此我在Activity B中使用了以下代码:

     lv.setOnItemClickListener(new OnItemClickListener() {
     @Override
     public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        Bundle bundle = new Bundle();
        bundle.putString("TEXT", "Please work... pleeeeaasee");
        Intent mIntent = new Intent();
        mIntent.putExtras(bundle);
        setResult(RESULT_OK, mIntent);
        finish();
     }
     });
在调用的活动中,我有以下内容监听返回:
protected void onActivityResult(int requestCode, int resultCode, 
        Intent data) { 
            switch(requestCode) { 
            //TODO
            case RECIPE_CHOOSER:
                Toast.makeText(getApplicationContext(), "In recipe return", Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), "resultCode is " + String.valueOf(resultCode), Toast.LENGTH_SHORT).show();
                if (resultCode == RESULT_OK) {
                Bundle b = getIntent().getExtras();

                Toast.makeText(getApplicationContext(), "Returned " + b.getString("TEXT"), Toast.LENGTH_LONG).show();
                }
                if (resultCode == RESULT_CANCELED) {

                    }
                break;

                } 
            } 
        }

我可以看到请求代码被正确返回,但结果代码始终为0且数据始终为空。

我已经详细排查了问题,并且setResult方法正在工作,bundle确实有我传递的数据,但在某个时候它丢失了。

是否有任何我遗漏的清单中的内容或其他问题。这已经一度阻碍了我的项目进展。

3个回答

15

在您的列表活动中,尝试将onItemClickListener中的setResult行替换为以下内容:

if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
}
else {
    getParent().setResult(Activity.RESULT_OK, data);
}

我想知道是否有一个父活动,需要将数据绑定到该活动并设置结果...


我认为这个会起作用。我现在会尝试并在五分钟内回复您。感谢您的回复。 - Dean
3
戴夫,如果我现在和你在一起,我会为你买一杯可口的冰镇啤酒。它完美地解决了问题。再次感谢你…… - Dean
1
经过思考,我现在知道为什么我的原始代码无法工作了。我首先启动的意图(Activity B)实际上只是一个前置选项卡持有者意图,然后在两个不同的选项卡上启动了另外两个意图(第一个选项卡用于查看本地文件,第二个选项卡用于查看网络位置的文件)。主要返回的意图应该是第一个意图,这就是为什么Daves出色的答案指向了父级。今天我学到了东西。 - Dean
标签持有者在几周前也让我遇到了同样的问题...很高兴你现在解决了,祝你圣诞快乐 :-) - David Brown
这个答案救了我的一天... +1 :) - Umair

5
关于您返回的数据。
您需要执行以下操作:
Bundle b = getIntent().getExtras();

但是"getIntent()"返回启动此活动的Intent。 如果您想要来自为结果启动的Activity的返回数据,只需获取传递给

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

-3

你的代码完美地运行着……

in u Activity B
use
  setResult(0, mIntent);insted of setResult(RESULT_OK, mIntent);
in your Activity A:
use
case 0: insted case RECIPE_CHOOSER: and 
use System.out.println(b.getString("TEXT"));

你将会得到以下输出:

请工作...拜托了


6
这实际上是掩盖问题。0是RESULT_CANCELED枚举的值,而不是RESULT_OK的值。当调用finish()时,来自Activity B的任何返回结果如果没有设置结果代码,则会自动设置为RESULT_CANCELED。请注意,我已经尽力使翻译通俗易懂,但未改变原意。 - jaseelder

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