从Activity上下文外调用startActivity()
我已经在我的Android应用程序中实现了一个ListView
。 我使用ArrayAdapter
类的自定义子类绑定到此ListView
。 在重写的ArrayAdapter.getView(...)
方法中,我分配了一个OnClickListener
。 在OnClickListener
的onClick
方法中,我想启动一个新的活动。 我得到的例外:
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
我怎样才能得到ListView
(当前Activity
)正在工作的Context
?
或
- 通过适配器中的构造函数cachingContext对象,或者
- 从你的angular度来看。
或者作为最后的手段,
- 添加 – FLAG_ACTIVITY_NEW_TASK标志为您的意图:
_
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
编辑 – 我会避免设置标志,因为它会干扰事件和历史堆栈的正常stream量。
我用“ addFlags ”来代替“setFlags”
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
根据它的文件 :
为意图添加额外的标志(或与现有的标志值)。
编辑
请注意,如果您使用的标志,您更改历史堆栈Alex Volovoy的答案说:
…避免设置标志,因为它会干扰事件和历史堆栈的正常stream动。
而不是使用(getApplicationContext)
使用YourActivity.this
如果因为使用下面的创buildselect器而出现错误:
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"));
设置标志来创build像这样的select器:
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);
我想也许你在错误的地方实现了OnClickListener–通常你应该在你的Activity中实现一个OnItemClickListener,并将它设置在ListView上,否则你的事件会遇到问题。
另外:如果你在链表中显示链接的片段 ,不要像这样创build它
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);
看,如果你正在一个方法中创build一个listiner内的意图
override onClick (View v).
然后通过这个视图调用上下文:
v.getContext ()
甚至不需要SetFlags …
即使从活动调用StartActivity, Xamarin.Android(MonoDroid)上的任何人都可以获得这个 – 实际上这是Xamarin在新ART运行时的bug,请参阅https://bugzilla.xamarin.com/show_bug.cgi?id=17630
在我看来,最好是在Activity.class
的代码中使用startActivity()
的方法。 如果你在Adapter
或其他类中使用它,就会导致这种情况。
当起始活动不知道他的活动是什么时,就会出现这个错误。 所以你必须在startActivity()之前添加活动
你必须设置
activity.startActivity(yourIntent);
详细阐述Alex Volovoy的答案 –
如果你得到这个问题的片段,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后,立即调用上面的方法来创build一个新的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调用不同的活动,而不会弄乱标志。
注意:尽量不要通过缓冲区的构造函数来caching上下文对象(使用适配器,很好)。一个片断应该有一个空的构造函数,否则在某些情况下应用程序会崩溃。
记得打电话
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);
我希望这会工作。
我有同样的问题。 问题在于上下文。 如果要打开任何链接(例如通过select器共享任何链接)传递活动上下文,而不是应用程序上下文。
不要忘了添加myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
如果你不在你的活动。
面对同样的问题,然后执行
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
并解决了这个问题。
可能还有另一个与列表视图适配器有关的原因。
你可以看到这个博客 ,描述得非常好。
使用这个代码。 对我来说工作得很好; 分享一些活动之外的东西
Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); // Append Text String Text = "Your Text Here" intent.putExtra(Intent.EXTRA_TEXT, Text); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent shareIntent = Intent.createChooser(intent,"Share . . . "); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); G.context.getApplicationContext().startActivity(shareIntent);
Intent i= new Intent(context, NextActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);