从安卓-活动上下文外部启动活动(
我在安卓APP上实现了上下文。 使用Activity类的自定义子类绑定到此ListView。 已将OnClickListener .分配给重新编写的ArrayAdapter.getView (. )方法。 我想用onClick的onClick方法开始新的活动。 我得到了例外:
Calling startActivity () fromoutsideofanactivitycontextrequiresthe
flag _ activity _ new _ task flag.isthisreallywhatyouwant?
如何获取正在运行ListView (当前活动)的上下文?
21个解决方案
467电压
或者
从适配器中的构造函数缓存上下文对象,或
从你的观点来看。
或者作为最后的手段
-将- FLAG_ACTIVITY_NEW_TASK标记添加到意图中:
_
my intent.setflags (intent.flag _ activity _ new _ task );
编辑-避免设置标志。 因为这会干扰正常的事件流和历史堆栈。
坚固的烤鸡volovoyanswered 2019-02-11t 10336026336036 z
80伏特
要实现这一点,请使用addFlags而不是setFlags
my intent.add flags (intent.flag _ activity _ new _ task );
根据文件,请执行以下操作
向intent添加其他标志(或使用现有标志值)。
编辑
使用改变历史堆栈的徽标时,坚固的烤鸡肉串Volovoy的回答如下。
.请不要设置标志。 因为这会妨碍事件和历史堆栈的正常流程。
brunobierianswered 2019-02-11t 10336027336032 z
45伏特
使用(getApplicationContext )代替YourActivity.this
jeffreynyaukeanswered 2019-02-11t 10336027336058 z
21电压
如果由于如下创建选择器而发生错误:
intentsharingintent=new intent (intent.action _ view;
sharing intent.add flags (intent.flag _ activity _ new _ task;
sharing intent.setdata (uri.parse (http://谷歌.com);
开始活动(intent.create chooser ) sharingintent,' Open With ' );
通过设置标志创建选择器,如下所示:
intentsharingintent=new intent (intent.action _ view;
sharing intent.add flags (intent.flag _ activity _ new _ task;
sharing intent.setdata (uri.parse (http://谷歌.com);
intentchooserintent=intent.create chooser (sharing intent,' Open With ';
chooser intent.add flags (intent.flag _ activity _ new _ task;
sart activity (选择内容);
sanath _ p answered 2019-02-11t 10336028336033 z
13电压
我想你可能在错误的地方实施了OnClickListener -。 通常,您应该在您的Activity中实现OnItemClickListener并将其设置为ListView。 否则,你的案件会发生问题……。
mreicheltanswered 2019-02-11t 10336028336059 z
10电压
另外,如果要在剪辑视图中显示链接,请不要这样创建
适配器=new list adapter (get activity ).getApplicationContext ),mStrings );
打电话
适配器=新列表适配器(获取活动)、mStrings );
适配器在这两种情况下都工作,但链接仅适用于最后一个。
djdance ans
wered 2019-02-11T10:29:39Z7 votes
CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);
要么
Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);
改为以下
CustomAdapter mAdapter = new CustomAdapter( this, yourlist);
Murtaza Ashraf answered 2019-02-11T10:30:08Z
5 votes
如果您在某个方法中在侦听器中创建意图,请参阅
override onClick (View v).
然后通过这个视图调用上下文:
v.getContext ()
甚至不需要SetFlags ......
Paulo Linhares - Packapps answered 2019-02-11T10:30:48Z
3 votes
对于任何人在Xamarin.Android(MonoDroid)上获取此功能,即使从活动中调用StartActivity - 这实际上是新的ART运行时的Xamarin错误,请参阅[https://bugzilla.xamarin.com/show_bug.cgi?id=17630]
rouen answered 2019-02-11T10:31:16Z
3 votes
当startactivity不知道他的活动是什么时,会出现此错误。 所以你必须在startActivity()之前添加活动
你必须设置
activity.startActivity(yourIntent);
Cabezas answered 2019-02-11T10:31:49Z
2 votes
在我看来,最好在你的Activity.class的代码中使用startActivity()的方法。如果你在Adapter或其他类中使用它,它将导致它。
kaosmys answered 2019-02-11T10:32:17Z
2 votes
详细阐述强健的烤鸡 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
}
现在,在你的主要活动中,稳重的棉花糖定义外部类,并将活动的上下文作为参数时,你立即调用上面的方法。在你的主要活动中也有一个功能 -
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()函数中也是如此。
Flying Monkey answered 2019-02-11T10:33:53Z
2 votes
我也有同样的问题。 检查您已通过的所有上下文。 对于“链接”,它需要Activity Context而不是Application context。
这是您应该检查的地方:
1.)如果您使用了LayoutInflater,那么请检查您传递的上下文。
2.)如果您使用任何适配器,请检查您已通过的上下文。
codemaniac answered 2019-02-11T10:34:40Z
2 votes
我有同样的问题。 问题在于背景。 如果要打开任何链接(例如,通过选择器共享任何链接),请传递活动上下文,而不是应用程序上下文。
如果您不在活动中,请不要忘记添加myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。
Coder29 answered 2019-02-11T10:35:16Z
1 votes
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(viewIntent);
我希望这会奏效。
Chirag Patel answered 2019-02-11T10:35:55Z
1 votes
面对同样的问题,然后实施
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
并解决了这个问题。
可能存在与列表视图适配器相关的另一个原因。
你可以看到这个博客,描述得很好。
Mayank Sharma answered 2019-02-11T10:36:49Z
1 votes
使用此代码。 对我来说很好;从活动外部分享一些东西
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);
Pooya Hayati answered 2019-02-11T10:37:18Z
0 votes
Intent i= new Intent(context, NextActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Chandan Lal answered 2019-02-11T10:37:43Z
0 votes
如果您在Cordova插件中调用共享Intent,设置Flag将无济于事。 而是使用这个 -
cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title"));
Sandeep Kumar answered 2019-02-11T10:38:11Z
0 votes
我的情况有点不同,我正在使用or测试我的应用程序,我不得不从仪器Intent.FLAG_ACTIVITY_NEW_TASK(这不是来自Activity的那个)启动我的活动|。
fun intent(context: Context) = Intent(context, HomeActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
我不得不更改标志并添加or按位(在Java中为|)和Intent.FLAG_ACTIVITY_NEW_TASK
因此它导致:
fun intent(context: Context) = Intent(context, HomeActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
Rafael Ruiz Muñoz answered 2019-02-11T10:38:54Z
0 votes
由于添加标志会影响event_flow和stack_history,因此最好通过以下方式将“应用程序上下文”传递给需要调用活动类的非活动:
“ActivityClassName.this”(当您以这种方式传递上下文时,它将包含从非活动场景调用活动所需的所有详细信息和信息)
所以不需要设置或添加标志,这在每种情况下都可以正常工作。
Musthafa answered 2019-02-11T10:39:36Z