Eu implementei um ListView
no meu aplicativo Android. Eu vinculo a isso ListView
usando uma subclasse personalizada da ArrayAdapter
classe. Dentro do ArrayAdapter.getView(...)
método substituído , eu atribuo um OnClickListener
. No onClick
método do OnClickListener
, quero iniciar uma nova atividade. Eu recebo a exceção:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Como posso obter o Context
que o ListView
(o atual Activity
) está trabalhando?
Respostas:
Ou
Ou, como último recurso,
_
Editar - eu evitaria definir sinalizadores, pois isso interfere no fluxo normal da pilha de eventos e histórico.
fonte
context.startActivity(intent);
eu só mudoucontext
a partirApplicationContext
deActivity
tipo. Isso resolveu o problema.Você pode conseguir isso com addFlags em vez de
setFlags
De acordo com a documentação, ele faz:
EDITAR
Esteja ciente de que, se você estiver usando sinalizadores, altera a pilha do histórico, como diz a resposta de Alex Volovoy :
fonte
Em vez de usar
(getApplicationContext)
useYourActivity.this
fonte
activity.startActivity
vez de #context.startActivity
Se você recebeu um erro por usar o seletor de criação como abaixo:
Defina o sinalizador para criar um seletor como este:
fonte
Além disso: se você mostrar links no listview no fragmento , não o crie assim
em vez disso chame
O adaptador funciona bem nos dois casos, mas os links funcionam apenas no último.
fonte
getApplicationContext()
(exceto a inicialização do aplicativo), mas peguei essa exceção. Então, as situações podem ser diferentes.this
como contexto funciona no que se refere à atividade atual.Acho que talvez você esteja implementando o OnClickListener no lugar errado - geralmente você deve definitivamente implementar um OnItemClickListener em sua atividade e defini-lo no ListView, ou você terá problemas com seus eventos ...
fonte
ou
mude para abaixo
fonte
Na
Android 28(Android P)
startActivityEntão, a melhor maneira é adicionar
FLAG_ACTIVITY_NEW_TASK
fonte
Veja, se você estiver criando uma intenção dentro de um listener em algum método
em seguida, chame o contexto também por meio dessa visualização:
Nem será necessário SetFlags ...
fonte
Para alguém que está conseguindo isso no Xamarin.Android (MonoDroid), mesmo quando StartActivity é chamado de atividade - esse é realmente um bug do Xamarin com o novo tempo de execução ART, consulte https://bugzilla.xamarin.com/show_bug.cgi?id=17630
fonte
Elaborando um pouco mais a resposta de Alex Volovoy -
caso você esteja tendo esse problema com fragmentos, getActivity () funciona bem para obter o contexto
Em outros casos:
Se você não quiser usar-
faça uma função como essa no seu OutsideClass -
Agora, em sua atividade principal, sempre que você criar uma nova OutsideClass, chame o método acima imediatamente após definir o OutsideClass, fornecendo o contexto da atividade como argumento. Também em sua atividade principal, faça uma função
agora volte para o OutsideClass e, para iniciar uma nova atividade, faça algo assim:
Dessa forma, você poderá iniciar atividades diferentes chamadas de OutsideClass diferentes sem mexer nos sinalizadores.
Nota: Tente não armazenar em cache o objeto de contexto via construtor para fragmento (com adaptador, tudo bem). Um fragmento deve ter um construtor vazio, caso contrário, o aplicativo trava em alguns cenários.
lembre-se de ligar
na função onResume () também.
fonte
Esse erro ocorre quando a atividade de inicialização não sabe qual é a atividade dele. Portanto, você deve adicionar atividades antes de startActivity ()
você deve definir
fonte
startActivity
a partir deFragment
, um chamador pode muitas vezes ser um fragmento, não uma atividade.Na minha opinião, é melhor usar o método
startActivity()
just no seu código doActivity.class
. Se você usar isso naAdapter
ou em outra classe, isso resultará nisso.fonte
Eu também tive o mesmo problema. Verifique todo o contexto que você passou. Para ' links ', ele precisa de Contexto de Atividade, não Contexto de Aplicativo .
Este é o local onde você deve verificar:
1.) Se você usou o LayoutInflater , verifique o contexto em que passou.
2.) Se você estiver usando algum adaptador, verifique em qual contexto você passou.
fonte
Eu tive o mesmo problema. O problema está no contexto. Se você deseja abrir qualquer link (por exemplo, compartilhar qualquer link através do seletor), passe o contexto da atividade, não o contexto do aplicativo.
Não se esqueça de adicionar
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
se você não estiver em sua atividade.fonte
Use este código em seu Adapter_Activity e use
context.startActivity(intent_Object)
eintent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Como isso:
Funciona....
fonte
Eu espero que isso funcione.
fonte
Enfrentou o mesmo problema implementado
e foi resolvido o problema.
Pode haver outro motivo relacionado ao adaptador de exibição de lista.
Você pode ver este blog , descreveu-o muito bem.
fonte
Use este código. Funciona bem para mim. Compartilhe algo de fora de uma atividade:
fonte
Como a adição de sinalizadores afeta
event_flow
estack_history
é melhor passar o 'contexto do aplicativo' para a não atividade de onde você precisa chamar uma classe de atividade da seguinte maneira:"ActivityClassName.this" (embora você passe o contexto dessa maneira, ele conterá todos os detalhes e informações necessários para chamar uma atividade de um cenário que não seja de atividade)
Portanto, não há necessidade de definir ou adicionar sinalizadores; isso funcionará bem em todos os casos.
fonte
fonte
Se você estiver chamando o compartilhamento de intenção no plug-in Cordova, a configuração do sinalizador não ajudará. Em vez disso, use isso -
fonte
Minha situação era um pouco diferente, estou testando meu aplicativo usando
Espresso
e tive que iniciar minha Atividade comActivityTestRule
a instrumentaçãoContext
(que não é a que vem de umActivity
).Eu tive que mudar os sinalizadores e adicionar um
or
bit a bit (|
em Java) comIntent.FLAG_ACTIVITY_NEW_TASK
Portanto, resulta em:
fonte
Versão Kotlin
fonte