Вызов функции startActivity() извне контекста активности
Я применил ListView в своем приложении для Android. Я привязываюсь к этому ListView с помощью пользовательского подкласса класса ArrayAdapter . Внутри переопределенного метода ArrayAdapter.getView(. ) я назначаю OnClickListener . В методе onClick OnClickListener я хочу запустить новое действие. Я получаю исключение:
Как я могу получить Context , что работает ListView (текущий Activity )?
ОТВЕТЫ
Ответ 1
- кешировать объект Context через конструктор в вашем адаптере или
- получить его из вашего представления.
Или, в крайнем случае,
- добавить флаг FLAG_ACTIVITY_NEW_TASK в свои намерения:
Изменить — я бы избегал установки флагов, поскольку это будет мешать нормальному потоку событий и стека истории.
Ответ 2
Вы можете достичь этого с помощью addFlags вместо setFlags
Согласно документации это делает:
Добавьте дополнительные флаги к цели (или с существующим значением флагов).
РЕДАКТИРОВАТЬ
Имейте в виду, что если вы используете флаги, вы меняете стек истории, как сказал Алексей Воловой:
. избегайте установки флагов, так как это будет мешать нормальному потоку событий и стека истории.
Ответ 3
Вместо использования (getApplicationContext) используйте YourActivity.this
Ответ 4
Если вы получили ошибку из-за использования create chooser, как показано ниже:
Установите флаг для создания выбора:
Ответ 5
Я думаю, что, возможно, вы внедряете OnClickListener в неподходящее место — обычно вам нужно обязательно реализовать OnItemClickListener в своей деятельности и вместо этого установить его в ListView, иначе у вас появятся проблемы с вашими событиями.
Ответ 6
Кроме того: если вы показываете ссылки в списке в фрагменте, не создавайте его так
В обоих случаях адаптер работает нормально, но ссылки работают только в последнем.
Ответ 7
изменить на ниже
Ответ 8
См., если вы создаете намерение в списке в каком-то методе
затем вызовите контекст через это представление:
Вам даже не нужны SetFlags.
Ответ 9
Для любого, кто получает это на Xamarin.Android(MonoDroid), даже когда StartActivity вызывается из активности — это на самом деле ошибка Xamarin с новым временем выполнения ART, см. https://bugzilla.xamarin.com/show_bug.cgi?id=17630
Ответ 10
Эта ошибка возникает, когда стартовая активность не знает, чем он занимается. Таким образом, вы должны добавить активность перед startActivity()
вы должны установить
Ответ 11
На мой взгляд, лучше использовать метод startActivity() только в вашем коде Activity.class . Если вы используете это в Adapter или другом классе, это приведет к этому.
Ответ 12
Разрабатывая Алекс Воловой, ответьте немного больше —
в случае, если u получает эту проблему с фрагментами, getActivity() отлично работает, чтобы получить контекст
В других случаях:
Если вы не хотите использовать —
затем создайте такую функцию в OutsideClass —
Теперь, в своем основном действии, когда вы делаете новый OutsideClass, вызывается вышеупомянутый метод сразу же после того, как вы определяете OutsideClass, предоставляя контекст активности в качестве аргумента. Также в вашем основном действии сделайте функцию —
теперь вернитесь к OutsideClass, и чтобы начать новую деятельность, сделайте что-то вроде этого —
Таким образом, вы сможете запускать различные действия, вызываемые из другого OutsideClass, не испортив флаги.
Примечание. Не пытайтесь кэшировать объект-контекст через конструктор для фрагмента (с адаптером, его тонким). У фрагмента должен быть пустой конструктор, в противном случае приложение вылетает в некоторых сценариях.
не забудьте позвонить
в функции onResume().
Ответ 13
У меня также была та же проблема. Проверьте весь контекст, который вы прошли. Для ссылок для этого требуется Контекст Контекст
Ответ 14
У меня была та же проблема. Проблема связана с контекстом. Если вы хотите открыть какие-либо ссылки (например, поделитесь любой ссылкой с помощью выбора), перейдите в контекст активности, а не в контекст приложения.
Не забудьте добавить myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) , если вы не в своей деятельности.
Ответ 15
Используйте этот код в вашей Adapter_Activity и используйте context.startActivity(intent_Object) и intent_Object.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Ответ 16
Надеюсь, что это сработает.
Ответ 17
Столкнулся с той же проблемой, а затем реализовал
и получил решение проблемы.
Может быть другая причина, связанная с адаптером представления списка.
Вы можете увидеть этот блог, описал его очень хорошо.
Ответ 18
Используйте этот код. У меня отлично работает. Поделитесь чем-то извне деятельности:
Ответ 19
Поскольку добавление флагов влияет на event_flow и stack_history лучше передать «контекст приложения» в stack_history из которого необходимо вызвать класс действия следующим образом:
«ActivityClassName.this» (если вы передадите контекст таким образом, он будет содержать все детали и информацию, необходимые для вызова действия из сценария бездействия)
Таким образом, нет необходимости устанавливать или добавлять флаги, это будет работать нормально в каждом случае.
Ответ 20
На Android 28(Android P) startActivity
Так что лучше всего добавить FLAG_ACTIVITY_NEW_TASK
Ответ 21
Ответ 22
Если вы вызываете share Intent в плагине Кордовы, установка флажка не поможет. Вместо этого используйте это —
Ответ 23
Моя ситуация немного отличалась, я тестирую свое приложение с помощью Espresso и мне пришлось запустить Activity с ActivityTestRule из Context инструментария (который не является результатом Activity ).
Мне пришлось изменить флаги и добавить or побитовый ( | в Java) с Intent.FLAG_ACTIVITY_NEW_TASK
Так что это приводит к:
Ответ 24
Я просто хочу заметить, что startActivity извне действия действует в некоторых версиях Android (между N и O-MR1), и интересным моментом является то, что это ошибка в исходном коде Android!
Это комментарий выше реализации startActivity . Смотрите здесь
Вызов начального действия извне действия без FLAG_ACTIVITY_NEW_TASK, как правило, не допускается, за исключением случаев, когда вызывающая сторона указывает идентификатор задачи, в котором должно быть запущено действие. Между N и O-MR1 существовала ошибка, которая позволяла этому работать.
Источник
Почему не вызывается метод startActivity?
Адаптер вообще не должен этим заниматься.
Все учатся самостоятельно.
Думаю, коммент Дениса вызван тем фактом, что нынче развелось слишком много быдло-коппипастеров, которе ничего не хотят понимать, пофиг что писать, главное — работает. Это прискорбно.
В данном случае: метод startActivity принадлежит интерфейсу контекста. Частенько адаптеры и вью-холдеры делают внутренними нестатическими классами активити. А так как активити наследует (или имплементирует, не помню) контекст, то в таких классах вы можете использовать данный метод без проблем.
Но у вас адаптер — отдельный класс. Соответственно, у вас нет внешнего класса откуда вы можете вызвать старт активити, и ваш копипаст со стековерфлов не работает.
Да, вам как то нужно получить контекс, и вы это сделали. Лично меня коробит то, что вы получаете контекст у изображения холдера — это частный случай, не общий. Я бы получал контекст у холдер.гетВью() — ибо этот метод работает со всеми холдерами.
Стоит еще упомянуть что контекст контексту розень (по кранй мере на старых андройдах так). Не все что позволенно сделать с контекстрм активити можно сделать с контекстом сервиса. Но это нужно перепроверить.
Источник