J'ai implémenté un ListView
dans mon application Android. Je me lie à cela en ListView
utilisant une sous-classe personnalisée de la ArrayAdapter
classe. Dans la ArrayAdapter.getView(...)
méthode redéfinie , j'attribue un OnClickListener
. Dans la onClick
méthode du OnClickListener
, je veux lancer une nouvelle activité. Je reçois l'exception:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Comment puis-je obtenir le sous Context
lequel le ListView
(le courant Activity
) fonctionne?
Réponses:
Soit
Ou en dernier recours,
_
Modifier - j'éviterais de définir des indicateurs car cela interférerait avec le flux normal des événements et de la pile d'historique.
la source
context.startActivity(intent);
je viens de changercontext
deApplicationContext
pour leActivity
type. Cela a résolu le problème.Vous pouvez y parvenir avec addFlags au lieu de
setFlags
Selon la documentation, il fait:
ÉDITER
Soyez conscient si vous utilisez des indicateurs que vous modifiez la pile d'historique comme le dit la réponse d'Alex Volovoy :
la source
Au lieu d'utiliser
(getApplicationContext)
useYourActivity.this
la source
activity.startActivity
au lieu decontext.startActivity
Si vous avez une erreur en raison de l'utilisation de l'outil de création de sélecteur comme ci-dessous:
Réglez le drapeau pour créer un sélecteur comme celui-ci:
la source
De plus: si vous affichez des liens dans listview en fragment , ne le créez pas comme ceci
appeler à la place
l'adaptateur fonctionne bien dans les deux cas, mais les liens ne fonctionnent que dans le dernier.
la source
getApplicationContext()
(sauf l'initialisation de l'application), mais j'ai pris cette exception. Les situations peuvent donc être différentes.this
contexte fonctionne en ce qui concerne l'activité actuelle.Je pense que vous implémentez peut-être OnClickListener au mauvais endroit - généralement, vous devriez certainement implémenter un OnItemClickListener dans votre activité et le placer à la place sur ListView, ou vous aurez des problèmes avec vos événements ...
la source
ou
changer en dessous
la source
Au
Android 28(Android P)
départActivitéDonc, la meilleure façon est d'ajouter
FLAG_ACTIVITY_NEW_TASK
la source
Voir, si vous créez une intention dans un listiner dans une méthode
puis appelez également le contexte à travers cette vue:
Il n'y aura même pas besoin de SetFlags ...
la source
Pour toute personne obtenant cela sur Xamarin.Android (MonoDroid) même lorsque StartActivity est appelé à partir d'une activité - il s'agit en fait d'un bogue Xamarin avec un nouveau runtime ART, voir https://bugzilla.xamarin.com/show_bug.cgi?id=17630
la source
Élaborer un peu plus la réponse d'Alex Volovoy -
au cas où vous auriez ce problème avec des fragments, getActivity () fonctionne bien pour obtenir le contexte
Dans d'autres cas:
Si vous ne voulez pas utiliser-
puis faites une fonction comme celle-ci dans votre OutsideClass -
Maintenant, dans votre activité principale, lorsque vous créez un nouvel OutsideClass, appelez la méthode ci-dessus immédiatement après avoir défini le OutsideClass en donnant le contexte de l'activité comme argument. Toujours dans votre activité principale, faites un
maintenant revenez à votre OutsideClass, et pour commencer une nouvelle activité, faites quelque chose comme ça-
De cette façon, vous pourrez démarrer différentes activités appelées à partir de différents OutsideClass sans gâcher les drapeaux.
Remarque - Essayez de ne pas mettre en cache l'objet contextuel via le constructeur pour le fragment (avec l'adaptateur, c'est bien). Un fragment doit avoir un constructeur vide sinon l'application se bloque dans certains scénarios.
n'oubliez pas d'appeler
dans la fonction onResume () également.
la source
Cette erreur survient lorsque startactivity ne sait pas quelle est son activité. Vous devez donc ajouter une activité avant startActivity ()
vous devez définir
la source
startActivity
depuisFragment
, un appelant peut souvent être un fragment, pas une activité.À mon avis, il vaut mieux utiliser la méthode de
startActivity()
juste dans votre code duActivity.class
. Si vous l'utilisez dans laAdapter
ou une autre classe, cela se traduira par cela.la source
J'ai aussi eu le même problème. Vérifiez tout le contexte que vous avez passé. Pour les « liens », il faut un contexte d'activité et non un contexte d'application .
C'est l'endroit où vous devez vérifier:
1.) Si vous avez utilisé LayoutInflater, vérifiez quel contexte vous avez passé.
2.) Si vous utilisez un adaptateur, vérifiez quel contexte vous avez passé.
la source
J'ai eu le même problème. Le problème vient du contexte. Si vous souhaitez ouvrir des liens (par exemple partager n'importe quel lien via le sélecteur), passez le contexte d'activité, pas le contexte d'application.
N'oubliez pas d'ajouter
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
si vous n'êtes pas dans votre activité.la source
Utilisez ce code dans votre Adapter_Activity et utilisez
context.startActivity(intent_Object)
etintent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Comme ça:
Ça marche....
la source
j'espère que cela fonctionnera.
la source
Face au même problème, puis mis en œuvre
et a résolu le problème.
Il peut y avoir une autre raison liée à l'adaptateur d'affichage de liste.
Vous pouvez voir ce blog , très bien décrit.
la source
Utilisez ce code. Fonctionne bien pour moi. Partager quelque chose de l'extérieur d'une activité:
la source
Depuis l'ajout de drapeaux
event_flow
,stack_history
il est préférable de passer le «contexte d'application» à la non-activité d'où vous devez appeler une classe d'activité de la manière suivante:"ActivityClassName.this" (pendant que vous passez le contexte de cette manière, il contiendra tous les détails et informations dont vous avez besoin pour appeler une activité à partir d'un scénario de non-activité)
Il n'est donc pas nécessaire de définir ou d'ajouter des indicateurs, cela fonctionnera bien dans tous les cas.
la source
la source
Si vous invoquez le partage d'intention dans le plug-in Cordova, la définition du drapeau n'aidera pas. Utilisez plutôt ceci -
la source
Ma situation était un peu différente, je teste mon application en utilisant
Espresso
et j'ai dû lancer mon Activity avecActivityTestRule
depuis l'instrumentationContext
(qui n'est pas celle qui vient d'unActivity
).J'ai dû changer les drapeaux et ajouter un
or
bit à bit (|
en Java) avecIntent.FLAG_ACTIVITY_NEW_TASK
Il en résulte donc:
la source
Version Kotlin
la source