0

2 番目のアクティビティの「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);
    }
}
}

2 番目のアクティビティ:

}
//-- 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

4 に答える 4

1

コードを次のように変更します。

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

あなたの場合の getIntent() は、最初のアクティビティが開始されたインテントを返しました。呼び出し元のアクティビティなので、2 番目のアクティビティからデータを返すことについては何もありません。

onBackPressed()UPD: また、2 番目のアクティビティが非常に奇妙に実装されていることを強調したいと思います。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();
}

それが役立つかどうかをお知らせください。

于 2012-09-03T20:05:22.953 に答える
0

あなたの間違いはあなたが結果コードを書いているリクエストコードの位置にあります(RESULT_OK)

startActivityForResult(i, RESULT_OK); //incorrect

私が提案しているのは、このような静的変数を作成することです

public static final int REQUEST_SECOND=100;

そしてそれを次のように渡します

statrtActivityForResult(i,REQUEST_SECOND);

次に、2番目のアクティビティで、結果の静的変数を作成します

public static final int MY_RESULT=101;

2番目のアクティビティを呼び出します

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);
    }
}
}
于 2012-09-03T21:09:10.350 に答える
0

私の「startActivityForResult」には、intではなく「RESULT_OK」が含まれていました。

OPに示されているものから次のように変更します。

startActivityForResult(i, 100);

それを修正しました。

みんなの貢献に感謝します!

于 2012-09-03T21:17:43.097 に答える
0

これを使ってみてください

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

値がゼロを返しているかどうかを確認します。これは、アクティビティからエクストラまたはバンドルを渡す際に問題があることを意味します。

コードでそれを処理するような条件がある場合、これらの関数は例外を通過しないと思います。

于 2012-09-03T20:28:05.550 に答える