web-dev-qa-db-ja.com

startActivityForResultを使用して、子アクティビティでrequestCodeを取得する方法は?

A、B、C、Dの4つのアクティビティがあります。私の場合、AはstartActivityForResultによってアクティビティBを開始します。

startActivityForResult(new Intent(this,B.class),ONE);

他の状況では、他の状況でBになります。好む

 startActivityForResult(new Intent(this,B.class),TWO);

Bでは、requestCodeに応じてCまたはDを呼び出す必要があります。つまり、Cを開始する必要がある場合、D.
したがって、子アクティビティのrequestCodeを確認する方法を知る必要があります(Bはこちら)。
つまり、アクティビティBが開始されたリクエストコードを取得します。

79
Jithin

余分に置くことでリクエストコードを渡すことができます。

intent.putExtra("requestCode", requestCode);   

または、startActivityForResultを何度も使用し、それぞれを編集するよりも優れている場合は、override内のstartActivityForResultActivityに追加し、次のようにコードを追加します。

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

したがって、startActivityForResultをすべて編集する必要はありません。
お役に立てば幸いです

126

要求コードは、この値を知る必要がないため(また、そうすべきではないため)、開始されたアクティビティに自動的に渡されません。何をすべきかを知るだけで、どこから始めたのかを知る必要はありません。

アクティビティを開始することは、実際にはメソッドを呼び出す別の形式です。メソッドを呼び出すと、結果が同期的に受信されます(呼び出しを行った場所)。この場合、メソッドが作業を行うために必要な情報のみを渡します。どこから呼び出したのかを伝えていません。

アクティビティの開始は、メソッド呼び出しの非同期的な類似物です。この場合、特別なメソッドonActivityResult()で結果を受け取ります。このメソッドでは、受け取ったばかりの結果をどう処理するかを知る必要があり、そのための要求コードがあります。

リクエストコードをパラメーターとして渡すのが得策ではない理由を少し明確にするために、購入可能な製品を示すアクティビティの例を考えてみましょう。このアクティビティには、「購入」と「ログイン」というラベルの付いた2つのボタンがあります(現在ログインしていないため)。 「ログイン」を押すと、「ログイン」という名前のアクティビティが開始され、指定された情報を使用してユーザーのログインが試行されます。 「購入」を押すと、最初にまったく同じ「ログイン」アクティビティが開始され、ログインが成功した場合は、購入アクティビティが開始されます。

これで、「ログイン」ボタンは要求コード1を使用してログインアクティビティを開始しますが、「購入」ボタンは、ログインが成功した場合に別の操作を行う必要があるため、同じ要求コードを使用できません。そのため、[購入]ボタンはリクエストコード2を使用します。

「ログイン」アクティビティでは、呼び出し元に応じて2つの異なる要求コードを受け取ることがありますが、まったく同じ手順を実行する必要があります。

そのため、リクエストコードをパラメータとして渡すと、次のようないくつかの異なるリクエストコードに対して同じ処理を行う必要があるコードになります。

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

また、リクエストコード定数を中央の場所に保存することになります。 RequestCodesという名前のクラス。

つまり、リクエストコードは、受信した結果をどう処理するかを決定するためにのみ使用する必要があります。このようにして、よりモジュール化され、保守が容易になり、コードを拡張しやすくなります。

25
Szabolcs Berecz

最終的に、カスタムIntentアクションを使用して、この種の情報を起動中のアクティビティに渡しました。

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

その後、次のようになります:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

アクティビティBでは、アクションを簡単に取得できます。

getIntent().getAction();
7
Marcel Bro

GetCallingActivity()を使用して、現在のアクティビティを開始し、最後に応答コードを含む結果値を受け取るアクティビティを取得できます。

0
Moaz Rashad