从Activity上下文外部调用startActivity()

Sak*_*o73 339 android android-context android-activity

ListView在我的Android应用程序中实现了一个.我ListView使用类的自定义子类绑定到此ArrayAdapter.在重写ArrayAdapter.getView(...)方法中,我指定了一个OnClickListener.在onClick方法中OnClickListener,我想发布一个新活动.我得到了例外:

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

我怎样才能获得ContextListView(当前Activity)下工作?

Ale*_*voy 544

  • 通过适配器中的构造函数缓存Context对象,或
  • 从你的角度来看.

或作为最后的手段,

  • 添加 - FLAG_ACTIVITY_NEW_TASK标记到您的意图:

_

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)

编辑 - 我会避免设置标志,因为它会干扰正常的事件流和历史堆栈.

  • 当我做这样的事情时,我得到了这个异常`context.startActivity(intent);`我刚刚将`context`从`ApplicationContext`改为`Activity`类型.这解决了这个问题. (70认同)
  • 那么我无法控制系统创建的Intent(以及标志)的TextView的_autoLink_功能怎么样? (6认同)
  • @AlexSemeniuk - 只要您将活动作为上下文传递给适配器,自动链接就会起作用 (2认同)

Bru*_*eri 93

您可以使用addFlags代替它来实现它setFlags

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)

根据文件,它做:

向intent添加其他标志(或使用现有标志值).


编辑

请注意,如果你使用的是改变历史堆栈的标志,Alex Volovoy的回答是:

...避免设置标志,因为它会干扰事件和历史堆栈的正常流动.


Jef*_*uke 58

而不是(getApplicationContext)使用YourActivity.this

  • 最佳答案! (2认同)

san*_*h_p 32

如果由于使用如下创建选择器而出现错误:

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"));
Run Code Online (Sandbox Code Playgroud)

设置标志以创建选择器,如下所示:

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);
Run Code Online (Sandbox Code Playgroud)

  • 这非常有用。确切的选择器意图应该具有此标志! (4认同)
  • 这是正确的解决方案,确切的说是intent.chooser中的new_task (2认同)

mre*_*elt 14

我想也许你正在错误的地方实现OnClickListener - 通常你应该在你的Activity中实现一个OnItemClickListener并将其设置在ListView上,否则你的事件就会出现问题......

  • 你引导我找到解决方案.我需要使用分配给ListView的OnItemClickListener.以下是其他任何人的链接:http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html http://www.androidpeople.com/android-custom-listview-tutorial-example-part -2 /感谢您的帮助. (2认同)

djd*_*nce 12

另外:如果您在片段视图中显示链接,请不要像这样创建它

adapter = new ListAdapter(getActivity().getApplicationContext(),mStrings);
Run Code Online (Sandbox Code Playgroud)

而是打电话

adapter = new ListAdapter(getActivity(),mStrings);
Run Code Online (Sandbox Code Playgroud)

适配器在两种情况下都能正常工作,但链接仅适用于最后一个.


Ale*_*Lee 9

Android 28(Android P)startActivity

if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
        && (targetSdkVersion < Build.VERSION_CODES.N
                || targetSdkVersion >= Build.VERSION_CODES.P)
        && (options == null
                || ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
    throw new AndroidRuntimeException(
            "Calling startActivity() from outside of an Activity "
                    + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
                    + " Is this really what you want?");
}
Run Code Online (Sandbox Code Playgroud)

所以最好的方法是添加 FLAG_ACTIVITY_NEW_TASK

Intent intent = new Intent(context, XXXActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)


小智 8

CustomAdapter mAdapter = new CustomAdapter( getApplicationContext(), yourlist);
Run Code Online (Sandbox Code Playgroud)

要么

Context mContext = getAppliactionContext();
CustomAdapter mAdapter = new CustomAdapter( mContext, yourlist);
Run Code Online (Sandbox Code Playgroud)

改为以下

CustomAdapter mAdapter = new CustomAdapter( this, yourlist);
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您在某个方法中在列表器中创建意图,请参阅

override onClick (View v).
Run Code Online (Sandbox Code Playgroud)

然后通过这个视图调用上下文:

v.getContext ()
Run Code Online (Sandbox Code Playgroud)

甚至不需要SetFlags ......