1
votes

L'appel de startActivity () en dehors d'un contexte d'activité nécessite FLAG_ACTIVITY_NEW_TASK

AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag l'erreur AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag . La trace complète de la pile:

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());
        }
    }
}

Je suis nouveau dans le développement Android et je ne sais pas comment le résoudre.

Mon code:

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)

Des idées?


3 commentaires

voici mes détails de logcat EXCEPTION FATALE: Processus principal: com.kd.book, PID: 3487 android.util.AndroidRuntimeException: L'appel de startActivity () depuis l'extérieur d'un contexte d'activité nécessite l'indicateur FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez? à android.app.ContextImpl.startActivity (ContextImpl.java:1238) à android.app.ContextImpl.startActivity (ContextImpl.java:1225) à com.kd.book.Adapter.MyComicAdapter $ 1.onClick (MyComicAdapter.‌ java: 63) sur com.kd.book.Adapter.MyComicAdapter $ MyViewHolder.onClick (MyCo‌ micAdapter.java:99)


@ K.DKamalDhital, utilisez ce view.getContext().startActivity(new Intent(context,ChapterActivity.class));


@ K.DKamalDhital, Pourquoi avez-vous créé myViewHolder.setRecyclerItemClickListener et que voulez-vous faire exactement? pouvez-vous expliquer que cela nous aidera à résoudre votre problème.


3 Réponses :


0
votes

Essayez de cette façon,
1. créez une interface dans votre adaptateur et transmettez-lui la position (j'espère que vous savez comment créer et utiliser une interface).
2. implémentez cette interface dans votre classe d'activité.
3. dans sa méthode de substitution, vous obtiendrez la position d'une liste.
4. en utilisant cette position, obtenez les données requises et l'intention d'appel.
Terminé.


3 commentaires

interface publique IRecyclerItemClickListener {void onClick (vue vue, position int); }


ne fonctionne pas ici est le problème principal myViewHolder.setRecyclerItemClickListener (new IRecyclerItemClickListener () {@Override public void onClick (View view, int position) {// enregistrer la bande dessinée sélectionnée 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));


Ok, dans votre startActivity, vous devez passer un objet d'intention et PAS newIntent.



0
votes

Le problème est que vous effectuez deux fois "nouvelle intention":

  • Une fois ici: Intent intent = new Intent(Intent.ACTION_VIEW);
  • Deuxième fois ici: context.startActivity(new Intent(context,ChapterActivity.class))

FLAG_ACTIVITY_NEW_TASK n'est pas défini au démarrage de l'activité. La version corrigée dans laquelle l'intention n'est créée qu'une seule fois ressemble à ceci:

adapter = new MyComicAdapter(this, list);

Mais votre vrai problème est que vous devez appeler startActivity sur le contexte Activity.

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

Plus de discussion ici: Comment démarrer une activité à partir d'un fragment?

Ce que vous tentez de faire avec FLAG_ACTIVITY_NEW_TASK doit être réservé à de rares cas, comme lorsque vous devez lancer une activité à partir d'un service. Mais il n'est ni nécessaire ni souhaitable de définir cet indicateur lors du démarrage d'une activité à partir d'un contexte d'interface utilisateur.

C'est pourquoi les avertissements demandent:

Est-ce vraiment ce que vous voulez?

La définition d'indicateurs spécialisés lors du lancement de l'activité conduit souvent à des comportements de backstack / navigation indésirables.

De plus, je ne peux pas voir si votre adaptateur se trouve à l'intérieur d'une activité ou d'un fragment. [Vous pouvez utiliser "this" dans une Acitivity et getActivity () dans un Fragment]

Enfin, je ne peux pas savoir comment vous créez l'adaptateur, mais la façon dont votre code est actuellement organisé, vous devez passer le contexte d'activité dans l'adaptateur pour qu'il fonctionne. À partir d'un fragment:

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

À partir d'une activité:

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

Cela empêchera probablement l'exception que vous obtenez.


2 commentaires

Intent intent = new Intent (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); tu en parles?


J'ai ajouté un exemple au bas de la réponse. À votre santé.



0
votes

Changez votre appel vers la nouvelle activité comme suit,

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


1 commentaires

java.lang.ClassCastException: android.app.ContextImpl ne peut pas être converti en android.app.Activity à com.kd.book.Adapter.MyComicAdapter $ 1.onClick (MyComicAdapter.‌ java: 61) à com.kd.book.Adapter .MyComicAdapter $ MyViewHolder.onClick (MyCo‌ micAdapter.java:98) J'ai eu ce problème après ce code.