1. ホーム
  2. アンドロイド

[解決済み】TabHostアクティビティから結果(startActivityForResult)を返すには?

2022-04-01 21:05:52

質問

私の例では、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、このクラスは通常のActivityです。

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

onActivityResultがクラスAで呼び出されますが、resultCodeが RESULT_CANCELED ではなく RESULT_OK となり、返されたインテントがnullになります。 TabHost内のActivityから何かを返すにはどうしたらよいでしょうか?

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

解決方法は?

ああ、もう! 数時間かけてAndroidのソースをダウンロードし、ようやく解決にたどり着きました。

Activityクラスを見てみると、以下のようになります。 finish() メソッドが結果を送り返すのは、もし mParent プロパティに設定されている null . そうでない場合は、結果が失われます。

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();

この問題のワークアラウンドを再び探す人がいれば、参考になるかと思います。