Вызов функции startActivity () извне контекста активности

Я реализовал ListView в своем приложении для Android. Я привязываюсь к этому ArrayAdapter ListView используя специальный подкласс класса ArrayAdapter . Внутри переопределенного ArrayAdapter.getView(...) я назначаю OnClickListener . В методе OnClickListener я хочу запустить новое действие. Я получаю исключение:

 Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 

Как я могу получить Context , с которым работает ListView (текущая Activity )?

Solutions Collecting From Web of "Вызов функции startActivity () извне контекста активности"

Или

  • Кешировать объект Context через конструктор в вашем адаптере или
  • Получите его с вашего взгляда.

Или, в крайнем случае,

  • Добавьте флаг FLAG_ACTIVITY_NEW_TASK в свои намерения:

_

 myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Изменить – я бы избегал установки флагов, поскольку это будет мешать нормальному потоку событий и стека истории.

Я решил его с помощью « addFlags » вместо «setFlags»

 myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Согласно документации, она делает:

Добавьте дополнительные флаги в намерение (или с существующим значением флагов).

РЕДАКТИРОВАТЬ

Имейте в виду, если вы используете флаги, которые вы меняете в стеке истории, как говорит Алекс Воловой :

… избегать установки флагов, поскольку это будет мешать нормальному потоку событий и стека истории.

Вместо использования (getApplicationContext) используйте YourActivity.this

Я думаю, что, возможно, вы внедряете OnClickListener в неподходящее место – обычно вам нужно обязательно реализовать OnItemClickListener в своей деятельности и вместо этого установить его в ListView, иначе у вас появятся проблемы с вашими событиями …

Если вы получили ошибку из-за использования create chooser, как показано ниже:

 Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); startActivity(Intent.createChooser(sharingIntent, "Open With")); 

Установите флаг для создания выбора:

 Intent sharingIntent = new Intent(Intent.ACTION_VIEW); sharingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sharingIntent.setData(Uri.parse("http://google.com")); Intent chooserIntent = Intent.createChooser(sharingIntent, "Open With"); chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(chooserIntent); 

Кроме того: если вы показываете ссылки в списке в фрагменте , не создавайте его так

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

Вместо этого позвоните

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

Адаптер работает отлично в обоих случаях, но ссылки работают только в последнем.

 CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist); 

или

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

Изменить ниже

 CustomAdapter mAdapter = new CustomAdapter( this, yourlist); 

Для любого, кто получает это на Xamarin.Android (MonoDroid), даже когда StartActivity вызывается из активности – это на самом деле ошибка Xamarin с новым временем выполнения ART, см. https://bugzilla.xamarin.com/show_bug.cgi?id=17630

См., Если вы создаете намерение в списке в каком-то методе

 override onClick (View v). 

Затем вызовите контекст через это представление:

 v.getContext () 

Вам даже не нужны SetFlags …

На мой взгляд, лучше использовать метод startActivity() только в вашем коде Activity.class . Если вы используете это в Adapter или другом классе, это приведет к этому.

Эта ошибка возникает, когда startactivity не знает, что является его деятельностью. Таким образом, вы должны добавить активность перед startActivity ()

Вы должны установить

 activity.startActivity(yourIntent); 

Разрабатывая ответ Алексея Вологового –

В случае, если u получает эту проблему с фрагментами, getActivity () отлично работает, чтобы получить контекст

В других случаях:

Если вы не хотите использовать –

 myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend 

Затем создайте такую ​​функцию в OutsideClass –

 public void gettingContext(Context context){ real_context = context;//where real_context is a global variable of type Context } 

Теперь, в вашей основной деятельности, когда вы когда-либо создаете новый OutsideClass, вызовите описанный выше метод сразу же после того, как вы определите OutsideClass, указав контекст активности в качестве аргумента. Кроме того, в вашем основном действии,

 public void startNewActivity(final String activity_to_start) { if(activity_to_start.equals("ACTIVITY_KEY")); //ACTIVITY_KEY-is a custom key,just to //differentiate different activities Intent i = new Intent(MainActivity.this, ActivityToStartName.class); activity_context.startActivity(i); }//you can make a if-else ladder or use switch-case 

Теперь вернемся к вашему OutsideClass, и чтобы начать новую деятельность, сделайте что-то вроде этого –

 @Override public void onClick(View v) { ........ case R.id.any_button: MainActivity mainAct = (MainActivity) real_context; mainAct.startNewActivity("ACTIVITY_KEY"); break; } ........ } 

Таким образом, вы сможете запускать различные действия, вызываемые из другого OutsideClass, не испортив флаги.

Примечание. Не пытайтесь кэшировать объект контекста с помощью конструктора для фрагмента (с адаптером, его тонким). У фрагмента должен быть пустой конструктор, иначе приложение выйдет из строя в некоторых сценариях.

Не забудьте позвонить

 OutsideClass.gettingContext(Context context); 

В функции onResume ().

У меня тоже была такая же проблема. Проверьте весь контекст, который вы прошли. Для « ссылок » ему нужен контекст контекста работы, а не контекст приложения .

Это место, где вы должны проверить:

1.) Если вы использовали LayoutInflater, то проверьте, в каком контексте вы прошли.

2.) Если вы используете какой-либо адаптер, проверьте, в каком контексте вы прошли.

 Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(viewIntent); 

Я надеюсь, что это сработает.

У меня такая же проблема. Проблема связана с контекстом. Если вы хотите открыть какие-либо ссылки (например, поделитесь любой ссылкой с помощью выбора), перейдите в контекст активности, а не в контекст приложения.

Не забудьте добавить myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) если вы не в своей деятельности.

 Intent i= new Intent(context, NextActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

Столкнувшись с той же проблемой,
intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
И решена проблема.

Возможно, есть еще одна причина, связанная с адаптером списка.
Вы можете увидеть этот блог , описал это очень хорошо.