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


85

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を開始する必要がある場合です。したがって、子アクティビティ(ここではB)でrequestCodeを確認する方法を知る必要があります。
つまり、アクティビティBが開始されたリクエストコードを取得したいと思います。

回答:


137

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

intent.putExtra("requestCode", requestCode);   

あなたが使用している場合やstartActivityForResult、より良い、それぞれの編集よりも、その後、何回も、あなたがすることができ、あなたの中で、次のようにそこにコードを追加します。 overridestartActivityForResultActivity

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

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


49
子アクティビティがリクエストコードを取得する方法は本当にありませんか?
i_am_jorf 2011年

1
今まで私の知る限り、他の方法はないと思います。
Labeeb Panampullan 2011年

17
同じことを疑問に思っていました-これは、論理的に意味をなさないAndroidAPIのそれらの1つです。
Artem Russakovskii 2011

7
startActivityForResultを使用して、他のアプリでアクティビティを開始できます。requestCodeはアプリの私的な問題です。この観点から、インテントにはそのようなメソッドがないことは理にかなっています。正しいアプローチは、アクティビティに実行させたいことを正確にアドバイスするsetActionです。
Maciej Beimcik 2017

27

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

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

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

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

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

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

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

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

また、RequestCodesという名前のクラスなど、中央の場所に要求コード定数を格納することになります。

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


1
それが一種の「マネージャー」であり、特定の値(エクストラに保存された値)を「保存」するためにリクエストコードを入力したい場合はどうでしょうか。値を「取得」する(そして追加で返す)別のリクエストコードですが、このアクティビティ内で、名前の変更、編集、削除など、保存された値を全体的に管理することもできます。そのようなことについてどう思いますか?同じアクションを実行するためにコード/アクティビティを複製することを防ぐことができると思います。
JRomero 2012

@ J.Romeroそうしないでください。物事が複雑になるだけです。その機能を(ユーティリティ/シングルトン)クラスに入れるだけです。あなたはまた、見たいかもしれませんハンドラおよびサービス
サボルチBerecz

3
Szabolcs子アクティビティは、「この値を知る必要がない」場合でも、チェーン内の次のアクティビティに値を渡す必要がある場合があります。皮肉なことに、このためにもっと冗長なコードを書く必要があります。何をすべきでないかについて読むためにもっと講義を受けるほど、私たちが知る必要のないことについて。
user250343 2013年

これが、子アクティビティがリクエストコードへのアクセスを拒否されるべき理由をどのように示しているのかわかりません。今すぐ購入し、ログイン呼び出しがとにかく2つの別々のアクティビティに対して行われることを考えると、特定の例でリクエストコードへのアクセスが必要になる理由さえわかりません。
Drazen Bjelovuk 2014年

1
@EvanR。おそらく、より良いアーキテクチャは、「マスター」アイテムアクティビティを個別の追加/編集アクティビティにサブクラス化することです。したがって、コードの再利用は最小限に抑えられますが、各アクティビティは個別に呼び出すことができます。
デーンパウエル

11

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

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

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.