从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。无法解决

时间:2019-02-23 13:49:03

标签: android android-intent runtime-error

我已经整天尝试了,但是无法解决,请帮助我出口,我不知道那里到底是什么问题。我是android开发中的新手。这是我的android项目代码,如下:我不知道发生了什么,一旦有,请检查一下。非常感谢。

`公共类MyComicAdapter扩展了RecyclerView.Adapter

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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题是您执行两次“新意图”:

  • 在这里:Intent intent = new Intent(Intent.ACTION_VIEW);
  • 第二次在这里:context.startActivity(new Intent(context,ChapterActivity.class))
启动活动时未设置

FLAG_ACTIVITY_NEW_TASK。仅创建一次Intent的更正版本如下所示:

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

但是真正的问题是您需要在Activity上下文中调用startActivity。

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

更多讨论在这里: How do I start an activity from within a Fragment?

您尝试使用FLAG_ACTIVITY_NEW_TASK进行的操作应保留给极少数情况,例如当您需要从服务启动活动时。但是,从UI上下文中启动Activity时,不必或不需要设置该标志。

这就是警告提示的原因:

  

这真的是您想要的吗?

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

此外,我看不到您的适配器是否位于“活动”或“片段”中。 [您可以在Acitivity中使用“ this”,在片段中使用getActivity()]

最后,我无法创建适配器,但是当前代码的组织方式需要将Activity上下文传递到Adapter中才能正常工作。从片段:

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

来自活动:

adapter = new MyComicAdapter(this, list);

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

答案 2 :(得分:0)

按如下所示将您的通话更改为新活动,

Intent intent=new Intent(context, ChapterActivity.class);
Activity activity=(Activity) context;
activity.startActivity(intent);