当前位置: 首页 > 知识库问答 >
问题:

在活动上下文之外调用startActivity()需要标记_Activity_NEW_TASK

金秦斩
2023-03-14

我收到错误AndroidRuntimeException:从活动上下文外部调用startActivity()需要标志_Activity_NEW_TASK标志。完整堆栈跟踪:

main Process: com.kd.book, PID: 3487 android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? at android.app.ContextImpl.startActivity(ContextImpl.java:1238) at android.app.ContextImpl.startActivity(ContextImpl.java:1225) at com.kd.book.Adapter.MyComicAdapter$1.onClick(MyComicAdapter.java:63) at com.kd.book.Adapter.MyComicAdapter$MyViewHolder.onClick(MyComicAdapter.java:99)

我是Android开发新手,不知道如何解决它。

我的代码

public class MyComicAdapter extends RecyclerView.Adapter<MyComicAdapter.MyViewHolder> {
    Context context;
    List<Comic> comicList;
    LayoutInflater inflater;

    public MyComicAdapter(Context context, List<Comic> comicList) {
        this.context = context;
        this.comicList = comicList;
        inflater=LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View itemView = inflater.inflate(R.layout.comic_item, viewGroup, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {

        Picasso.get().load(comicList.get(i).Image).into(myViewHolder.comic_image);
        myViewHolder.comic_name.setText(comicList.get(i).Name);

        //Event

        myViewHolder.setRecyclerItemClickListener(new IRecyclerItemClickListener(){

            @Override
            public void onClick(View view, int position) {
                //save the comic selected
                Common.comicSelected = comicList.get(position);
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(new Intent(context,ChapterActivity.class));

            }
        });
    }

    @Override
    public int getItemCount() {
        return comicList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView comic_name;
        ImageView comic_image;

        IRecyclerItemClickListener recyclerItemClickListener;

        public void setRecyclerItemClickListener(IRecyclerItemClickListener recyclerItemClickListener) {
            this.recyclerItemClickListener = recyclerItemClickListener;
        }

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            comic_image = itemView.findViewById(R.id.image_comic);
            comic_name = itemView.findViewById(R.id.comic_name);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {

            recyclerItemClickListener.onClick(view, getAdapterPosition());
        }
    }
}

有什么想法吗?

共有3个答案

时恩
2023-03-14

问题是你正在做两次“新意图”:

  • 这里:Intent Intent=新的Intent(Intent.ACTION_视图)

活动启动时未设置标志\活动\新任务。仅创建一次意图的更正版本如下所示:

Intent intent = new Intent(context, ChapterActivity.class))
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

但你真正的问题是,你需要在活动上下文中调用startActivity。

getActivity().startActivity(new Intent(getActivity(), ChapterActivity.class));

这里有更多的讨论:如何从片段中开始活动?

您尝试对FLAG_ACTIVITY_NEW_TASK所做的操作应该保留在罕见的情况下,例如当您需要从服务启动活动时。但从UI上下文中启动活动时,没有必要或不希望设置该标志。

这就是为什么警告会问:

这真的是你想要的吗?

在启动活动时设置专门的标志通常会导致不必要的后台/导航行为。

此外,我无法看到您的适配器是否位于活动或片段中。[您可以在Aciality中使用this,并在片段中使用getActive()]

最后,我不知道您是如何创建适配器的,但是您的代码当前的组织方式需要将活动上下文传递到适配器中,才能使其工作。从一个片段:

adapter = new MyComicAdapter(getActivity(), list);

从活动中:

adapter = new MyComicAdapter(this, list);

这很可能会防止您遇到异常。

史烈
2023-03-14

将您的呼叫更改为新活动,如下所示:,

Intent intent=new Intent(context, ChapterActivity.class);
Activity activity=(Activity) context;
activity.startActivity(intent);
刘选
2023-03-14

这样试试,
1。在适配器中创建一个接口,并将位置传递给它(希望您知道如何制作和使用接口)
2。将该接口实现到活动类中
3。在其覆盖方法中,您将获得列表的位置
4。通过使用该位置,获取所需数据并在其中调用意图<好了。

 类似资料: