Zaimplementowałem ListView
w mojej aplikacji na Androida. Wiążę się to ListView
przy użyciu niestandardowego podklasę ArrayAdapter
klasy. W przesłoniętej ArrayAdapter.getView(...)
metodzie przypisuję OnClickListener
. W onClick
metodzie OnClickListener
chcę rozpocząć nową działalność. Otrzymuję wyjątek:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Jak mogę uzyskać, Context
że ListView
(bieżący Activity
) działa?
Odpowiedzi:
Zarówno
Lub w ostateczności
_
Edytuj - unikałbym ustawiania flag, ponieważ zakłócałoby to normalny przepływ zdarzeń i stosu historii.
źródło
context.startActivity(intent);
po prostu zmieniłocontext
odApplicationContext
doActivity
typu. To rozwiązało problem.Możesz to osiągnąć za pomocą addFlags zamiast
setFlags
Zgodnie z dokumentacją :
EDYTOWAĆ
Pamiętaj, jeśli używasz flag, które zmieniają stos historii, ponieważ odpowiedź Alexa Volovoya mówi:
źródło
Zamiast używać
(getApplicationContext)
useYourActivity.this
źródło
activity.startActivity
Zamiastcontext.startActivity
Jeśli wystąpił błąd z powodu użycia opcji Utwórz selektor, jak poniżej:
Ustaw flagę, aby utworzyć selektor w ten sposób:
źródło
Ponadto: jeśli wyświetlasz fragmenty w widoku listy , nie twórz go w ten sposób
zamiast tego zadzwoń
adapter działa dobrze w obu przypadkach, ale linki działają tylko w ostatnim.
źródło
getApplicationContext()
(oprócz inicjalizacji aplikacji), ale złapałem ten wyjątek. Tak więc sytuacje mogą być inne.this
jako kontekst działa, ponieważ odnosi się do bieżącej aktywności.Myślę, że może wdrażasz OnClickListener w niewłaściwym miejscu - zwykle zdecydowanie powinieneś zaimplementować OnItemClickListener w swojej działalności i ustawić go na ListView, w przeciwnym razie wystąpią problemy ze swoimi zdarzeniami ...
źródło
lub
zmień na poniżej
źródło
Na początku
Android 28(Android P)
AktywnośćWięc najlepszym sposobem jest dodanie
FLAG_ACTIVITY_NEW_TASK
źródło
Zobacz, jeśli tworzysz zamiar w listiner w jakiś sposób
następnie wywołaj kontekst również przez ten widok:
SetFlags nie będzie nawet potrzebny ...
źródło
Dla każdego, kto dostanie to na Xamarin.Android (MonoDroid), nawet gdy StartActivity jest wywoływana z aktywności - jest to właściwie błąd Xamarin z nowym środowiskiem uruchomieniowym ART, patrz https://bugzilla.xamarin.com/show_bug.cgi?id=17630
źródło
Opracowując nieco odpowiedź Alexa Volovoya -
w przypadku, gdy otrzymujesz ten problem z fragmentami, getActivity () działa dobrze, aby uzyskać kontekst
W innych sprawach:
Jeśli nie chcesz używać-
następnie utwórz taką funkcję w swoim OutsideClass -
Teraz, w swoim głównym działaniu, kiedy tylko tworzysz nową OutsideClass, wywołaj powyższą metodę natychmiast po zdefiniowaniu OutsideClass, podając kontekst działania jako argument. Również w swojej głównej działalności wykonaj funkcję
teraz wróć do klasy OutsideClass i zacznij nową aktywność, zrób coś takiego -
W ten sposób będziesz mógł rozpocząć różne działania wywoływane z różnych OutsideClass bez zepsucia się flagami.
Uwaga - Staraj się nie buforować obiektu kontekstowego za pomocą konstruktora dla fragmentu (z adapterem, jest w porządku). Fragment powinien mieć pusty konstruktor, w przeciwnym razie aplikacja ulega awarii w niektórych scenariuszach.
pamiętaj, aby zadzwonić
również w funkcji onResume ().
źródło
Ten błąd występuje, gdy startactivity nie wie, jaka jest jego aktywność. Musisz więc dodać aktywność przed startActivity ()
musisz ustawić
źródło
startActivity
zFragment
, dzwoniący często może być fragmentem, a nie działaniem.Moim zdaniem, lepiej jest użyć metody
startActivity()
właśnie w twoim kodzieActivity.class
. Jeśli użyjesz tego w tejAdapter
lub innej klasie, spowoduje to.źródło
Też miałem ten sam problem. Sprawdź cały przekazany kontekst. Do „ linków ” potrzebny jest kontekst działania, a nie kontekst aplikacji .
To miejsce, w którym powinieneś sprawdzić:
1.) Jeśli użyłeś LayoutInflater, sprawdź, jaki kontekst przeszedłeś.
2.) Jeśli używasz adaptera, sprawdź, jaki kontekst przeszedłeś.
źródło
Miałem ten sam problem. Problem dotyczy kontekstu. Jeśli chcesz otworzyć dowolne linki (na przykład udostępnić dowolny link przez selektor), podaj kontekst działania, a nie kontekst aplikacji.
Nie zapomnij dodać,
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
jeśli nie jesteś w swojej działalności.źródło
Użyj tego kodu w swojej Adapter_Activity i użyj
context.startActivity(intent_Object)
iintent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Lubię to:
To działa....
źródło
mam nadzieję, że to zadziała.
źródło
W obliczu tego samego problemu, a następnie wdrożony
i został rozwiązany problem.
Może istnieć inny powód związany z adapterem widoku listy.
Możesz zobaczyć Ten blog , bardzo dobrze go opisał.
źródło
Użyj tego kodu. Działa dobrze dla mnie. Udostępnij coś spoza działania:
źródło
Ponieważ dodanie flag wpływa
event_flow
istack_history
lepiej jest przekazać „kontekst aplikacji” do niedziałania, z którego należy wywołać klasę działania w następujący sposób:„ActivityClassName.this” (podczas przekazywania kontekstu w ten sposób będzie on zawierał wszystkie szczegóły i informacje potrzebne do wywołania działania z scenariusza braku aktywności)
Nie ma więc potrzeby ustawiania ani dodawania flag, będzie to działać dobrze w każdym przypadku.
źródło
źródło
Jeśli wywołujesz zamiar udostępniania we wtyczce Cordova, ustawienie flagi nie pomoże. Zamiast tego użyj tego -
źródło
Moja sytuacja była trochę inna, testuję aplikację
Espresso
i musiałem uruchomić moją Aktywność zaActivityTestRule
pomocą oprzyrządowaniaContext
(które nie pochodzi od anActivity
).Musiałem zmienić flagi i dodać
or
bitowe (|
w Javie) za pomocąIntent.FLAG_ACTIVITY_NEW_TASK
Skutkuje to:
źródło
Wersja Kotlin
źródło