web-dev-qa-db-ja.com

resultCodeは常に0で、requestは常に-1です。 Activity.onActivityResult();

これをresultCode == 0requestCode == 0に関する別の質問リストに追加したいと思います。

概要は次のとおりです。NoteActivitystartActivityForResult()を使用してNoteSettingsActivityを呼び出します。

Webを検索し、super.onBackPressed()のときに戻るボタンを押すと、resultCode == 0。さらに調査したところ、戻るボタンが押されるたびにこのコードが返されるようですが、そのsuper.onBackPressed()呼び出しを失敗させた後、単にfinish()アプリケーションをonActivityResult()resultCodeはまだ0に等しいです。それはrequestCodeと同じです。

また、マニフェストファイルを操作してみました。この作業を行うためだけに多くの変更を加えましたが、何も機能しません。

これがスニペットです。以前のコミットに戻ったため、最近の変更を失ったことに注意してください。ただし、resultCodeが常に0(ACTIVITY_CANCELED)に等しいことに気付く前に、作成したコードを確認してください。

@Override
public void onNoteSettingsActivityCalled(Note note)
{
    Intent intent = new Intent(this, NoteSettingsActivity.class);
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_ID, note.getNoteID());

    startActivityForResult(intent, NoteRequest.REQUEST_UPDATE_SETTINGS);
}

アクティビティがバックプレスを検出したときは次のとおりです。

@Override
public void onBackPressed()
{   
    Log.i(NoteApplication.TAG, "NoteSettingsActivity.onBackPressed() has been called.");

    Intent intent = new Intent();
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_REMINDENABLED , mRemindEnabled);
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_REMINDEVERY   , mDaysSelected);
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_REMINDON      , String.valueOf(mRemindDateTime));
    intent.putExtra(NoteExtrasKey.EXTRA_NOTE_ID            , mTargetNoteID);

    if(getParent() != null)
        getParent().setResult(Activity.RESULT_OK, intent);
    else
        setResult(Activity.RESULT_OK, intent);

    super.onBackPressed();
}

NoteActivityが結果の呼び出しを受信した方法は次のとおりです。

    @Override
public void onActivityResult(int result, int request, Intent intent)
{
    super.onActivityResult(result, request, intent);

    Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() has been called.");
    Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() result = " + result + " request = " + request);

    if(result == Activity.RESULT_CANCELED)
        return;

    switch(request)
    {
        case NoteRequest.REQUEST_UPDATE_SETTINGS:

            if(intent == null) return;

            int noteID = intent.getIntExtra(NoteExtrasKey.EXTRA_NOTE_ID, -1);
            String remindOnString = intent.getStringExtra(NoteExtrasKey.EXTRA_NOTE_REMINDON);

            if(remindOnString != null && !remindOnString.equals(""))
                mRemindDateTime = Timestamp.valueOf(remindOnString);

            mHasSettingsEnabled = true;
            mRemindEnabled = intent.getBooleanExtra(NoteExtrasKey.EXTRA_NOTE_REMINDENABLED, false);
            mSelectedDays = intent.getIntegerArrayListExtra(NoteExtrasKey.EXTRA_NOTE_REMINDEVERY);

            if(noteID < 0)
            {
                Note note = mNoteDatabaseHelper.getNote(noteID);
                note.setRemindEnabled(mRemindEnabled);
                note.remindEvery(mSelectedDays);
                note.remindOn(mRemindDateTime);

                onNoteItemUpdated(note); 
            }

            Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() NoteRequest.REQUEST_UPDATE_SETTINGS called.");

            break;

        default:
            Log.i(NoteApplication.TAG, "NoteActivity.onActivityResult() : unknown request code = " + request);
            break;
    }
}

これを実行すると、resultCodeは0に等しく、requestCodeは-1に等しくなります。これに渡されたインテントを確認しましたが、nullではありません。

この質問に非常に関連する質問があります。それらのどれも機能しませんでした:

ResultCodeとrequestCodeの値が途中で送信した値を失う原因を理解するだけで、プロジェクトに取り組んでいる多くの重要な時間を失っています。

任意のヘルプとガイダンスをいただければ幸いです。どうもありがとうございました!

10
Neon Warge

正しい署名は

public void onActivityResult(int requestCode, int resultCode, Intent data) {

リクエストと結果が混同されています。

4
FunkTheMonk

私の場合、2つの理由でresultCode == 0エラーが発生しました。

まず、別のアクティビティからではなく、フラグメントからメソッドをコピーしました。

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

これを防ぐ良い方法は@Overrideメソッド。これにより、デフォルトのアクティビティonActivityResultメソッドシグネチャをオーバーライドしていることがわかります。

正しい署名を使用してください:

public void onActivityResult(int requestCode, int resultCode, Intent data) {

第二に、私はこれをしていました:

    super.onBackPressed();
    Intent intent = new Intent();
    intent.putExtra(getString(R.string.like_count), people.size());
    Log.e(TAG, people.size() +" people ");
    setResult(RESULT_OK, intent);
    finish();

Super.onBackPressed()は、実際に設定される前にresultCodeを設定したため、結果は0になりました。

簡単な修正により、正しく機能します。

    Intent intent = new Intent();
    intent.putExtra(getString(R.string.like_count), people.size());
    Log.e(TAG, people.size() +" people ");
    setResult(RESULT_OK, intent);
    super.onBackPressed();
23
Simon

super.onBackPressed()の呼び出しは、最終的に結果コードを設定し、それを呼び出し元のアクティビティに送り返すものです。その呼び出しをfinish()の呼び出しに置き換えると、探している結果コードが得られるはずです。

お役に立てれば!

3
k3v1n4ud3

デバイスからアプリケーションをアンインストールしているときに同じ問題に直面していました。次のように入力することで解決されました:intentObject.putExtra(Intent.EXTRA_RETURN_RESULT、true); startActivityForResultを実行する前に。

1

The Android Big Nerd RanchBookからの参加者の場合、おそらくコードのタイプミスです。正しく再比較:

_if (requestCode == REQUEST_CODE_CHEAT) {
if (RESULT_OK == resultCode) {...} 
...
}
_

リマインダー: _RESULT_OK_は常に-1であり、その存在はsetResult()が子アクティビティから呼び出されたことを意味します。

0
Yidir