Aller au contenu

Problème avec Parcelable


lord_ure

Recommended Posts

Salut tout le monde.

Je suis en train de coder un projet pour débuter dans android, et j'ai un problème pour passer un objet entre plusieurs activités.

Au début je ne savais pas du tout comment faire et j'ai vu sur le net qu'il fallait que ma classe implémente l'interface Parcelable. C'est donc ce que j'ai fais. Je peux maintenant ajouter mon objet à l'intent qui lancera la seconde activité. Sauf que maintenant mon startActivity ne fonctionne pas, testé au débugger.

Voici mon code :

Lancement de ma seconde activité:

               Intent intent = null;
             ...........................  
              else {
                   intent = new Intent(Quizz.this, Correction.class);
                   intent.putExtra("questionnaire",qcm);
               }
               int g = 0;
               startActivity(intent);
           }
       });

et ma classe QCM : les méthodes à implémentées sont à la fin.

package org.me.quizz;

import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author YAK
*/
//!QCM is the class containg the questions
public class QCM implements Parcelable {

   private String explication;
   private String type;
   private String copyright;
   private ArrayList questions;

   //Ce constructeur est un constructeur de test
   public QCM() {
       explication = "Questionnaire de test";
       type = "country";
       copyright = "LABOUBOU";
       questions = new ArrayList();
       Reponse r1 = new Reponse(1, "première réponse", Uri.EMPTY);
       Reponse r2 = new Reponse(2, "deuxième réponse", Uri.EMPTY);
       Reponse r3 = new Reponse(3, "troisième réponse", Uri.EMPTY);
       Reponse r4 = new Reponse(4, "4eme réponse", Uri.EMPTY);

       ArrayList rrrr = new ArrayList();
       rrrr.add(r1);
       rrrr.add(r2);
       rrrr.add(r3);
       rrrr.add(r4);

       Question qq = new Question(1, "Voici la première question", rrrr);
       questions.add(qq);


   }

   private QCM(Parcel in) {
       this.type = in.readString();
       this.explication = in.readString();
       this.copyright = in.readString();
       in.readList(questions, null);
   }

   public String getExplication() {
       return explication;
   }

   public void setExplication(String explication) {
       this.explication = explication;
   }

   public String getCopyright() {
       return copyright;
   }

   public void setCopyright(String copyright) {
       this.copyright = copyright;
   }

   public String getType() {
       return type;
   }

   public void setType(String type) {
       this.type = type;
   }

   public int getNumberOfQuestion() {
       return questions.size();
   }

   public void addQuestion(Question q) {
       questions.add(q);
   }

   public Question getQuestion(int i) {
       return questions.get(i);
   }

   public int describeContents() {
       return 0;
   }

   public void writeToParcel(Parcel arg0, int arg1) {
       arg0.writeString(copyright);
       arg0.writeString(type);
       arg0.writeString(explication);
       arg0.writeList(questions);
   }
   public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

       public QCM createFromParcel(Parcel in) {
           return new QCM(in);
       }

       public QCM[] newArray(int size) {
           return new QCM[size];
       }
   };
}

Voilà, j'ai appliqué cette technique parce que c'est tout ce que j'ai trouvé, et je ne suis pas sûr que mon implémentation de parcelable soit correcte, mais je ne vois où j'aurais pu me tromper.

Voyez-vous le problème ou connaissez-vous une autre méthode pour passer mon instance de QCM à ma seconde activité?

++

Lien vers le commentaire
Partager sur d’autres sites

Ce n'est pas ta classe que tu dois rendre statique, mais l'instance que tu souhaites passer. En gros tu colles un sale "public static QCM currentQCM" quelque part et tu le définis/lis au besoin. Mais on est d'accord que c'est moche :P

Sinon ton startActivity, quand tu dis qu'il "ne fonctionne pas", il te répond quoi exactement (quelle est l'exception levée, voire la stack trace) ?

Lien vers le commentaire
Partager sur d’autres sites

Ton objet Question est-il lui-même Parcelable ?

Plus globalement, je pense que la bonne façon de faire serait plutôt de gérer tes QCM/Questions/Réponses dans une base de données et de transmettre des identifiants entre tes activity.

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

Salut et merci pour vos réponses.

En fait au début je ne comprenais pas le static parce que mon objet était déclaré en interne dans ma méthode, mais je l'ai modifié et maintenant tout marche nickel, encore merci.

Quant je disais que le starActivity ne fonctionne pas c juste que j'avais l'erreur application stopped unexpectedly, je ne sais pas comment afficher plus de détail lors d'une erreur.

Pour Question non, je ne l'avais pas mise en Parcelable, j'aurais dû la mettre?

Et merci à deckans pour les tutos, je regarderais ça dès que j'aurais le temps, après mon itération en fait ;)

++ :cool:

Lien vers le commentaire
Partager sur d’autres sites

L'AIDL je ne pense pas que ce soit réellement approprié pour son cas... c'est sensé permettre la communication entre process, ce qui est bien différent de la simple transmission de données dans un enchainement d'activities...

Donc pour moi, soit il faut implémenter Parcelable jusqu'au bout (tous les objets liés à un QCM doivent être Parcelable pour pouvoir transmettre un QCM en Parcel), soit il stocke les données des QCM/questions/réponses quelque part (généralement en base sqlite) et transmet des identifiants entre les activities.

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...