无法理解为什么onActivityResult不起作用

时间:2012-09-03 20:03:07

标签: android android-intent

第二个活动上的“setResult”要么没有将数据传递回第一个onActivityResult,要么onActivityResult甚至没有被调用...我无法弄清哪个


第一项活动:

//-- Handle item selection
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_settings:
            Intent i = new Intent(this, Options.class);
            Bundle counters = new Bundle();
            counters.putInt("plWin", plWin);
            counters.putInt("plLoss", plLoss);
            counters.putInt("plDraw", plDraw);
            i.putExtras(counters);
            startActivityForResult(i, RESULT_OK);
            return true;
        case R.id.menu_reset:




//-- Data being passed from "Options" --
protected void onActivityResult(int requestCode, int resultCode, Intent i){
    Bundle counts = i.getExtras();
    if (resultCode == RESULT_OK) {
        Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();

        plWin = counts.getInt("Win", 100);
        plLoss = counts.getInt("Loss", 100);
        plDraw = counts.getInt("Draw", 100);
    }
}
}

第二项活动:

}
//-- Data being passed back to "Main" -- 
public void onBackPressed() {
    Bundle counters = new Bundle();
    Intent i = new Intent();
    counters.putInt("Win", wins);
    counters.putInt("Loss", losses);
    counters.putInt("Draw", draws);
    i.putExtras(counters);
    setResult(RESULT_OK, i);
    finish();
}
}

4 个答案:

答案 0 :(得分:1)

将代码更改为:

Bundle counts = data.getExtras();
if (resultCode == RESULT_OK) {  
    plWin = counts.getInt("Win");
    plLoss = counts.getInt("Loss");
    plDraw = counts.getInt("Draw");
}
你的案例中的

getIntent()返回了第一个活动开始的意图。调用者活动,所以没有关于从第二个活动返回数据。

UPD: 另外我想强调第二个活动中onBackPressed()的实现非常奇怪。它正在调用super.onBackPressed(),默认设置为“已取消”结果,因此不保证您的RESULT_OK将成为真正的返回值。

我建议更改代码:

public void onBackPressed() {
    Bundle counters = new Bundle();
    Intent i = new Intent();
    counters.putInt("Win", wins);
    counters.putInt("Loss", losses);
    counters.putInt("Draw", draws);
    i.putExtras(counters);
    setResult(RESULT_OK, i);
    finish();
}

请告知我们是否有帮助。

答案 1 :(得分:0)

尝试使用此

plWin=data.getIntExtra("Win",0);
plLoss=data.getIntExtra("Loss",0);
plDraw=data.getIntExtra("Draw",0);

并检查值是否返回零,这意味着从活动传递额外或Bundle时会出现问题。

如果有任何类似的条件通过代码处理,但我认为这些函数不会通过任何异常。

答案 2 :(得分:0)

您错误处于您正在编写结果代码(RESULT_OK)

的请求代码的位置
startActivityForResult(i, RESULT_OK); //incorrect

我建议制作一个像这样的静态变量

public static final int REQUEST_SECOND=100;

并将其传递给

statrtActivityForResult(i,REQUEST_SECOND);

然后在第二个活动中为结果制作静态变量

public static final int MY_RESULT=101;

并调用第二个活动

setResult(MY_RESULT);

并写上onActivityResult像这样:

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

if(requestcod==REQUEST_SECOND){


    Bundle counts = i.getExtras();
    if (resultCode == MY_RESULT) {
        Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();

        plWin = counts.getInt("Win", 100);
        plLoss = counts.getInt("Loss", 100);
        plDraw = counts.getInt("Draw", 100);
    }
}
}

答案 3 :(得分:0)

我的'startActivityForResult'中有“RESULT_OK”而不是int。

将其从OP中显示的更改为:

startActivityForResult(i, 100);

修好了。

感谢大家的贡献!