Jump to content

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é?

++

Link to comment
Share on other 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) ?

Link to comment
Share on other 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.

Edited by Nivek
Link to comment
Share on other 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:

Link to comment
Share on other 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.

Edited by Nivek
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...