我已经在我的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上下文外部调用startActivity()

val context = activity.applicationContext
openBrowser(context, MenuUrl.TERM_CONDITION)

Do

   1. val context = binding.root.context // If you are using view binding
   2. val context = yourView.context // If you are not use view binding
    openBrowser(context, MenuUrl.TERM_CONDITION)

谢谢你!

其他回答

我认为也许你在错误的地方实现OnClickListener -通常你应该在你的活动中实现OnItemClickListener,并将其设置在ListView上,否则你会遇到事件问题…

因为添加标志会影响event_flow和stack_history,所以最好将“应用上下文”传递给非活动,从那里你需要以以下方式调用一个活动类:

“ActivityClassName。(当你以这种方式传递上下文时,它将包含你从非活动场景中调用一个活动所需的所有细节和信息)

所以不需要设置或添加标志,这将在任何情况下工作良好。

在我看来,最好在Activity.class的代码中使用startActivity()方法。如果您在适配器或其他类中使用它,则会导致该结果。

我的情况有点不同,我正在使用Espresso测试我的应用程序,我必须从仪器环境中启动我的活动与ActivityTestRule(这不是一个来自活动)。

fun intent(context: Context) = 
    Intent(context, HomeActivity::class.java)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

我不得不改变标志,并添加一个或位(在Java中|)与意图。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)

另外:如果你在listview中以片段的形式显示链接,不要这样创建它

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

而不是打电话

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

适配器在这两种情况下都工作得很好,但链接只在最后一种情况下工作。