Ich habe eine ListView
in meiner Android-Anwendung implementiert . Ich binde daran ListView
mit einer benutzerdefinierten Unterklasse der ArrayAdapter
Klasse. Innerhalb der überschriebenen ArrayAdapter.getView(...)
Methode weise ich eine zu OnClickListener
. In der onClick
Methode von OnClickListener
möchte ich eine neue Aktivität starten. Ich bekomme die Ausnahme:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Wie kann ich das bekommen, unter dem Context
der ListView
(der aktuelle Activity
) arbeitet?
Antworten:
Entweder
Oder als letztes Mittel,
_
Bearbeiten - Ich würde das Setzen von Flags vermeiden, da dies den normalen Ablauf des Ereignis- und Verlaufsstapels stört.
quelle
context.startActivity(intent);
ich gerade geändertcontext
vonApplicationContext
zuActivity
Art. Dies hat das Problem behoben.Sie können dies mit addFlags anstelle von erreichen
setFlags
Laut Dokumentation gilt Folgendes:
BEARBEITEN
Beachten Sie, wenn Sie Flags verwenden, dass Sie den Verlaufsstapel ändern, wie in der Antwort von Alex Volovoy angegeben :
quelle
Anstatt Verwendung zu
(getApplicationContext)
verwendenYourActivity.this
quelle
activity.startActivity
anstelle voncontext.startActivity
Wenn Sie aufgrund der Verwendung von create chooser wie unten einen Fehler erhalten haben:
Setzen Sie das Flag, um eine Auswahl wie folgt zu erstellen:
quelle
Außerdem: Wenn Sie Links in der Listenansicht in Fragmenten anzeigen , erstellen Sie sie nicht so
stattdessen anrufen
Der Adapter funktioniert in beiden Fällen einwandfrei, aber die Links funktionieren nur im letzten.
quelle
getApplicationContext()
(außer Anwendungsinitialisierung), habe aber diese Ausnahme abgefangen. Situationen können also anders sein.this
als Kontext funktioniert in Bezug auf die aktuelle Aktivität.Ich denke, vielleicht implementieren Sie den OnClickListener an der falschen Stelle - normalerweise sollten Sie auf jeden Fall einen OnItemClickListener in Ihrer Aktivität implementieren und ihn stattdessen in der ListView festlegen, sonst treten Probleme mit Ihren Ereignissen auf ...
quelle
oder
nach unten wechseln
quelle
Bei der
Android 28(Android P)
startActivityDer beste Weg ist also hinzufügen
FLAG_ACTIVITY_NEW_TASK
quelle
Überprüfen Sie, ob Sie in einer Methode eine Absicht innerhalb eines Listeners erstellen
Rufen Sie dann auch den Kontext über diese Ansicht auf:
Es werden nicht einmal SetFlags benötigt ...
quelle
Für alle, die dies auf Xamarin.Android (MonoDroid) erhalten, auch wenn StartActivity von der Aktivität aufgerufen wird - dies ist tatsächlich ein Xamarin-Fehler mit neuer ART-Laufzeit, siehe https://bugzilla.xamarin.com/show_bug.cgi?id=17630
quelle
Die Antwort von Alex Volovoy etwas näher erläutern -
Falls dieses Problem mit Fragmenten auftritt, funktioniert getActivity () einwandfrei, um den Kontext abzurufen
In anderen Fällen:
Wenn Sie nicht verwenden möchten-
dann machen Sie eine Funktion wie diese in Ihrer OutsideClass -
Wenn Sie jetzt in Ihrer Hauptaktivität eine neue OutsideClass erstellen, rufen Sie die obige Methode sofort auf, nachdem Sie die OutsideClass definiert haben und den Kontext der Aktivität als Argument angegeben haben. Auch in Ihrer Haupttätigkeit machen Sie eine Funktion-
Kehren Sie jetzt zu Ihrer OutsideClass zurück, und um eine neue Aktivität zu starten, gehen Sie wie folgt vor:
Auf diese Weise können Sie verschiedene Aktivitäten starten, die von verschiedenen OutsideClass aufgerufen werden, ohne die Flags durcheinander zu bringen.
Hinweis: Versuchen Sie, das Kontextobjekt nicht über den Konstruktor für das Fragment zwischenzuspeichern (mit Adapter, es ist in Ordnung). Ein Fragment sollte einen leeren Konstruktor haben, da sonst die Anwendung in einigen Szenarien abstürzt.
Denken Sie daran, anzurufen
auch in der Funktion onResume ().
quelle
Dieser Fehler tritt auf, wenn die Startaktivität nicht weiß, welche Aktivität er hat. Sie müssen also vor startActivity () Aktivität hinzufügen.
Sie müssen einstellen
quelle
startActivity
ausFragment
, kann ein Anrufer oft ein Fragment sein, nicht eine Aktivität.Meiner Meinung nach ist es besser, die Methode
startActivity()
nur in Ihrem Code des zu verwendenActivity.class
. Wenn Sie das in derAdapter
oder einer anderen Klasse verwenden, führt dies dazu.quelle
Ich hatte auch das gleiche Problem. Überprüfen Sie den gesamten Kontext, den Sie übergeben haben. Für ' Links ' wird der Aktivitätskontext und nicht der Anwendungskontext benötigt .
Dies ist der Ort, an dem Sie Folgendes überprüfen sollten:
1.) Wenn Sie LayoutInflater verwendet haben, überprüfen Sie, welchen Kontext Sie übergeben haben.
2.) Wenn Sie einen Adapter verwenden, überprüfen Sie, welchen Kontext Sie übergeben haben.
quelle
Ich hatte das gleiche Problem. Das Problem liegt im Kontext. Wenn Sie Links öffnen möchten (z. B. einen Link über die Auswahl freigeben möchten), übergeben Sie den Aktivitätskontext und nicht den Anwendungskontext.
Vergessen
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Sie nicht hinzuzufügen, wenn Sie nicht in Ihrer Aktivität sind.quelle
Verwenden Sie diesen Code in Ihrer Adapter_Activity und verwenden Sie
context.startActivity(intent_Object)
undintent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
So was:
Es klappt....
quelle
Ich hoffe das wird funktionieren.
quelle
Konfrontiert das gleiche Problem dann implementiert
und habe das Problem gelöst.
Es kann einen anderen Grund geben, der mit dem Listenansichtsadapter zusammenhängt.
Sie können diesen Blog sehen , der sehr gut beschrieben wurde.
quelle
Verwenden Sie diesen Code. Funktioniert gut für mich. Teilen Sie etwas von außerhalb einer Aktivität:
quelle
Da das Hinzufügen von Flags Auswirkungen hat
event_flow
undstack_history
es besser ist, den 'Anwendungskontext' an die Nichtaktivität zu übergeben, von wo aus Sie eine Aktivitätsklasse auf folgende Weise aufrufen müssen:"ActivityClassName.this" (Während Sie den Kontext auf diese Weise übergeben, enthält er alle Details und Informationen, die Sie zum Aufrufen einer Aktivität aus einem Nicht-Aktivitätsszenario benötigen.)
Es ist also nicht erforderlich, Flags zu setzen oder hinzuzufügen. Dies funktioniert in jedem Fall einwandfrei.
quelle
quelle
Wenn Sie Share Intent im Cordova-Plugin aufrufen, hilft das Setzen des Flags nicht. Verwenden Sie stattdessen diese -
quelle
Meine Situation war etwas anders, ich teste meine App mit
Espresso
und musste meine Aktivität mitActivityTestRule
der Instrumentierung startenContext
(die nicht von einer stammtActivity
).Ich musste die Flags ändern und ein
or
bitweises (|
in Java) mit hinzufügenIntent.FLAG_ACTIVITY_NEW_TASK
Daraus ergibt sich:
quelle
Kotlin-Version
quelle