277

私の例には 3 つのクラスがあります。クラス A、メイン アクティビティです。クラス A は startActivityForResult を呼び出します。

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

クラス B、このクラスは TabActivity です。

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

クラス C、このクラスは通常のアクティビティです。

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult はクラス A で呼び出されますが、resultCode はRESULT_CANCELED代わりにRESULT_OK返され、返されるインテントは null です。TabHost 内のアクティビティから何かを返すにはどうすればよいですか?

クラス C が実際にはクラス B の内部で実行されており、クラス B がRESULT_CANCELEDクラス A に戻っていることが問題であることに気付きました。回避策はまだわかりません。

4

5 に答える 5

367

なんてこった!数時間かけて Android ソースをダウンロードした後、ようやく解決策にたどり着きました。

Activity クラスを見ると、プロパティが に設定されてfinish()いる場合にのみ、そのメソッドが結果を返すことがわかります。それ以外の場合、結果は失われます。mParentnull

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

したがって、私の解決策は、次のように、存在する場合は結果を親アクティビティに設定することです。

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

誰かがこの問題の回避策を再度探している場合に役立つことを願っています.

于 2010-04-12T10:46:07.280 に答える
16

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

設定されていて、このインテントが既存のアクティビティから新しいアクティビティを起動するために使用されている場合、既存のアクティビティの返信ターゲットが新しいアクティビティに転送されます。

于 2011-07-13T00:10:25.413 に答える
1

クラス B にも onActivityResult を実装し、startActivityForResult を使用してクラス C を起動できます。クラス B で結果を取得したら、クラス C の結果に基づいて (クラス A の) そこに結果を設定します。私はこれを試していませんが、これはうまくいくと思います。

もう 1 つ気をつけなければならないことは、Activity A が singleInstance アクティビティであってはならないということです。startActivityForResult が機能するには、クラス B がアクティビティ A のサブ アクティビティである必要があり、これは単一インスタンス アクティビティでは不可能であり、新しいアクティビティ (クラス B) が新しいタスクで開始されます。

于 2010-03-23T06:57:24.913 に答える
-1

アクティビティ 1 からアクティビティ 2 を開始して結果を取得するには、startActivityForResult を使用してアクティビティ 1 に onActivityResult を実装し、アクティビティ 2 で setResult を使用します。

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
于 2015-07-31T16:12:29.997 に答える