Wie erhalte ich mit startActivityForResult den RequestCode in der untergeordneten Aktivität?

Lesezeit: 6 Minuten

Benutzer-Avatar
Jithin

Ich habe vier Aktivitäten, sagen wir A, B, C und D. Meine Situation ist, dass A die Aktivität B durch startActivityForResult starten wird.

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

In anderen Situationen werde ich B mit anderen Situationen. wie

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

In B muss ich je nach RequestCode C oder D anrufen. Dh wenn ONE C starten muss, sonst D.
Ich muss also wissen, wie ich den RequestCode in der untergeordneten Aktivität (B hier) überprüfen kann.
Mit anderen Worten, ich möchte den Anforderungscode erhalten, mit dem Aktivität B gestartet wurde.

Benutzer-Avatar
Labeeb Panampullan

Sie können den Anfragecode per Put extra übergeben.

intent.putExtra("requestCode", requestCode);   

Oder wenn Sie verwendet haben startActivityForResult viele Male, dann besser als jede Bearbeitung, können Sie override das startActivityForResult in deiner Activityfügen Sie Ihren Code dort so hinzu

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

Es ist also nicht erforderlich, alle Ihre startActivityForResult zu bearbeiten
Hoffe es hat dir geholfen

  • Gibt es wirklich keine Möglichkeit für eine untergeordnete Aktivität, ihren Anforderungscode zu erhalten?

    – i_am_jorf

    23. Juni 2011 um 0:33 Uhr

  • Bis jetzt denke ich nach bestem Wissen nicht anders.

    – Labeeb Panampullan

    23. Juni 2011 um 4:30 Uhr

  • Habe mich das gleiche gefragt – das ist eines dieser Dinge in den Android-APIs, die keinen logischen Sinn ergeben.

    – Artjom Russakowskij

    29. Juli 2011 um 21:34 Uhr

  • startActivityForResult kann verwendet werden, um Aktivitäten in anderen Apps zu starten, requestCode ist die Privatsache Ihrer App. In diesem Licht macht es Sinn, dass Intent keine solche Methode hat, und der richtige Ansatz besteht darin, Action festzulegen, indem Sie genau angeben, was die Aktivität tun soll.

    – Maciej Beimcik

    21. September 2017 um 11:17 Uhr

Der Anforderungscode wird nicht automatisch an die gestartete Aktivität übergeben, da sie diesen Wert nicht kennen muss (und sollte). Es muss nur wissen, was zu tun ist, und nicht, wo es gestartet wurde.

Das Starten einer Aktivität ist eigentlich nur eine andere Form des Methodenaufrufs. Wenn Sie eine Methode aufrufen, erhalten Sie das Ergebnis synchron (genau dort, wo Sie den Aufruf getätigt haben). In diesem Fall übergeben Sie nur die Informationen, die die Methode benötigt, um ihre Arbeit zu erledigen. Sie sagen ihm nicht, von wo aus Sie ihn angerufen haben.

Das Starten einer Aktivität ist das asynchrone Analogon zum Aufrufen einer Methode, in diesem Fall erhalten Sie das Ergebnis in der speziellen Methode onActivityResult(). Bei dieser Methode müssen Sie wissen, was Sie mit dem gerade erhaltenen Ergebnis tun sollen, und Sie haben den Anforderungscode dafür.

Um etwas klarer zu machen, warum es keine gute Idee ist, den Anforderungscode als Parameter zu übergeben, betrachten Sie die Beispielaktivität, die ein Produkt zeigt, das Sie kaufen können. Bei dieser Aktivität gibt es zwei Schaltflächen mit der Aufschrift „Kaufen“ und „Anmelden“ (da Sie derzeit nicht angemeldet sind). Durch Drücken von „Anmelden“ wird eine Aktivität namens „Anmelden“ gestartet, die versucht, den Benutzer mit den bereitgestellten Informationen anzumelden. Wenn Sie auf „Kaufen“ klicken, wird zunächst dieselbe Aktivität „Anmelden“ gestartet, und wenn die Anmeldung erfolgreich war, wird die Kaufaktivität gestartet.

Jetzt verwendet die Schaltfläche „Anmelden“ den Anforderungscode 1, um die Anmeldeaktivität zu starten, aber die Schaltfläche „Kaufen“ kann nicht denselben Anforderungscode verwenden, da sie etwas anderes tun muss, wenn die Anmeldung erfolgreich ist. Die Schaltfläche “Kaufen” verwendet also den Anforderungscode 2.

In der Aktivität “Anmelden” erhalten Sie möglicherweise zwei verschiedene Anforderungscodes, je nachdem, von wo aus der Anruf erfolgt ist, aber Sie müssen genau das gleiche Verfahren durchführen.

Wenn Sie also den Anforderungscode als Parameter übergeben, erhalten Sie am Ende einen Code, der dasselbe für ein paar verschiedene Anforderungscodes tun muss, wie zum Beispiel:

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

Am Ende werden Sie auch die Anforderungscode-Konstanten an einem zentralen Ort speichern, z. B. in einer Klasse namens RequestCodes.

Kurz gesagt, der Anforderungscode sollte nur verwendet werden, um zu entscheiden, was mit dem empfangenen Ergebnis geschehen soll. Auf diese Weise erhalten Sie am Ende einen modulareren, einfacher zu wartenden und einfacher zu erweiternden Code.

  • Was ist, wenn es sich um eine Art “Manager” handelt und Sie möchten, dass ein Anforderungscode eingeht, um einen bestimmten Wert zu “speichern” (in Extras gespeicherter Wert). Ein weiterer Anforderungscode, der einen Wert “wiederaufruft” (und Extras zurückgibt), aber innerhalb dieser Aktivität können sie auch die gespeicherten Werte insgesamt verwalten, z. B. Umbenennen, Bearbeiten, Löschen usw. Was denken Sie über so etwas? Ich denke, es würde das Duplizieren von Code/Aktivitäten verhindern, um dieselben Aktionen auszuführen.

    – JRomero

    8. April 2012 um 22:20 Uhr


  • @J.Romero Tu das nicht, es wird die Dinge nur verkomplizieren. Setzen Sie diese Funktionalität einfach in eine (Utility/Singleton)-Klasse. Vielleicht möchten Sie sich auch anschauen Handler und Service

    – Szabolcs Berecz

    12. April 2012 um 9:38 Uhr

  • Szabolcs Die untergeordnete Aktivität muss den Wert möglicherweise an die nächste Aktivität in einer Kette weitergeben, auch wenn sie “diesen Wert nicht kennen muss”. Ironischerweise müssen wir dafür mehr redundanten Code schreiben. Für etwas, das wir nicht so sehr wissen müssen, bekommen wir mehr Vorlesungen, um darüber zu lesen, was wir nicht tun sollten.

    – Benutzer250343

    8. März 2013 um 4:22 Uhr

  • Ich sehe nicht, wie dies veranschaulicht, warum einer untergeordneten Aktivität der Zugriff auf den Anforderungscode verweigert werden sollte. Ich bin mir nicht einmal sicher, warum der Zugriff auf den Anforderungscode in Ihrem speziellen Beispiel erforderlich wäre, wenn man bedenkt, dass die Sofortkauf- und Anmeldeaufrufe ohnehin zwei getrennte Aktivitäten sind.

    – Drazen Bjelovuk

    23. Mai 2014 um 16:46 Uhr

  • @EvanR. vielleicht wäre es eine bessere Architektur, die Elementaktivität “Master” in separate Aktivitäten zum Hinzufügen/Bearbeiten zu unterteilen. Es gibt also nur eine minimale Wiederverwendung von Code, aber jede Aktivität kann unabhängig aufgerufen werden.

    – Däne Powell

    19. Februar 2017 um 23:52 Uhr

Benutzer-Avatar
Marcel Bro

Am Ende habe ich eine benutzerdefinierte Intent-Aktion verwendet, um diese Art von Informationen an die Startaktivität zu übergeben.

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

Dann würdest du gehen wie:

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

Und in Aktivität B Sie erhalten die Aktion einfach:

getIntent().getAction();

  • funktioniert wie ein Zauber, wirklich die beste Antwort. Vielen Dank.

    – YvesLeBorg

    8. Januar 2021 um 23:51 Uhr

Sie können getCallingActivity() verwenden, um die Aktivität abzurufen, die die aktuelle Aktivität gestartet hat und die am Ende den Ergebniswert mit dem Antwortcode erhält.

1297840cookie-checkWie erhalte ich mit startActivityForResult den RequestCode in der untergeordneten Aktivität?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy