463 votes

Appel de startActivity() en dehors d'un contexte d'activité

J'ai mis en place un ListView dans mon application Android. Je me lie à cette ListView en utilisant une sous-classe personnalisée de la ArrayAdapter classe. À l'intérieur de la classe surchargée ArrayAdapter.getView(...) j'attribue un OnClickListener . Dans le onClick de la méthode 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 Context que le ListView (l'actuel Activity ) travaille sous l'égide de la Commission ?

1 votes

Je pense que la réponse d'Alex devrait être la solution "acceptée" à votre problème, puisqu'elle rectifie l'erreur que vous avez mentionnée d'une manière plus générique.

15 votes

J'adore le message "Est-ce vraiment ce que vous voulez ?"... J'ai déjà eu un message qui disait "Es-tu sûr de ne pas avoir oublié de désenregistrer un récepteur de diffusion quelque part ?" INCROYABLE ! Chapeau à celui qui a mis tous ces petits messages pour nous aider, nous les squabs.

1 votes

J'ai rencontré ce problème. Lorsque j'ai mis à jour targetSdkVersion à 28.

693voto

Alex Volovoy Points 34562

Soit

  • mettre en cache l'objet Contexte via le constructeur de votre adaptateur, ou
  • l'obtenir de votre point de vue.

Ou en dernier recours,

  • ajoutez - le drapeau FLAG_ACTIVITY_NEW_TASK à votre intention :

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Edit - j'éviterais de mettre des drapeaux car cela interfère avec le flux normal de la pile des événements et de l'historique.

6 votes

Qu'en est-il de la autoLink de la TextView où je ne peux pas contrôler l'intention (et donc les drapeaux) créée par le système ?

101 votes

J'ai eu cette exception quand j'ai fait quelque chose comme ça. context.startActivity(intent); Je viens de changer context de ApplicationContext a Activity type. Cela a réglé le problème.

0 votes

@AlexSemeniuk ont-ils trouvé une solution ?

125voto

viperbone Points 1108

Vous pouvez y parvenir avec addFlags au lieu de setFlags

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Selon le documentation il le fait :

Ajouter des drapeaux supplémentaires à l'intention (ou avec la valeur des drapeaux existants).


EDIT

Attention, lorsque vous utilisez des drapeaux, vous risquez de modifier la pile d'historique en tant que La réponse d'Alex Volovoy dit :

...évitez de placer des drapeaux car cela interférerait avec le flux normal de la pile d'événements et d'histoire.

1 votes

J'ai un problème très similaire. Avez-vous rencontré des problèmes avec la pile d'historique ou autre chose comme le suggèrent les réponses ci-dessus ?

1 votes

Je ne sais pas exactement ce que vous recherchez, mais vous pouvez lancer une activité sans historique de ce type : Intent intent = new Intent(Intent.ACTION_VIEW, "http : \\www.google.com "));intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) ; startActivity(intent) ;

0 votes

Pourquoi n'est-il pas recommandé d'ajouter des drapeaux ici ? Dans quelle mesure est-il important d'interférer avec le flux normal de la pile des événements et de l'historique ?

15voto

djdance Points 323

En outre, si vous affichez des liens en vue de la liste dans l'application fragment ne le créez pas comme ça

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);

appelle plutôt

adapter = new ListAdapter(getActivity(),mStrings);

L'adaptateur fonctionne bien dans les deux cas, mais les liens ne fonctionnent que dans le dernier.

0 votes

@user2676468 : ceci a résolu le problème de lien automatique pour moi.

0 votes

Cette réponse devrait être acceptée, au lieu d'utiliser des drapeaux, c'est mieux !

0 votes

@GastónSaillén, je n'utilise pas getApplicationContext() (sauf l'initialisation de l'application), mais a attrapé cette exception. Les situations peuvent donc être différentes.

14voto

mreichelt Points 6217

Je pense que vous implémentez peut-être le OnClickListener au mauvais endroit - en général, vous devez absolument implémenter un OnItemClickListener dans votre Activity et le définir sur le ListView à la place, ou vous aurez des problèmes avec vos événements...

2 votes

Tu me conduis à la solution. J'avais besoin d'utiliser un OnItemClickListener, attribué à la ListView. Voici quelques liens pour toute autre personne : developer.Android.com/reference/Android/widget/ androidpeople.com/ Merci pour votre aide.

0 votes

Veuillez fournir des réponses génériques. La réponse d'Alex Volovoy ci-dessous résout le problème de manière générique.

0 votes

Pour la postérité : Si vous le définissez directement comme setListener(new Listener) sur un composant nécessitant un Contexte, vous créez une référence implicite à l'activité entière qui fera fuir la mémoire comme vous ne le croiriez pas. Cela peut être contourné en créant un écouteur statique interne à la classe ou en déplaçant l'écouteur dans une classe distincte s'il doit être capable de gérer des entrées provenant de plusieurs origines.

9voto

Murtaza Ashraf Points 66
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);

ou

Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);

changement vers le bas

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X