lord_ure Posté(e) 23 mars 2010 Share Posté(e) 23 mars 2010 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é? ++ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 23 mars 2010 Share Posté(e) 23 mars 2010 débatut 50 fois. tu la colle en static ^^c'est pourri mais ça fonctionne. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
lord_ure Posté(e) 23 mars 2010 Auteur Share Posté(e) 23 mars 2010 (modifié) Je dois rendre ma classe QCM static? c ça? Parce que l'IDE ne me l'autorise pas. Et après je ne pourrais plus avoir plusieurs instances de ma classe !! ++ :cool: Modifié 23 mars 2010 par lord_ure Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
naholyr Posté(e) 24 mars 2010 Share Posté(e) 24 mars 2010 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) ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
dekans Posté(e) 24 mars 2010 Share Posté(e) 24 mars 2010 Pour passer des parcelable il y a l'AIDL : http://developer.android.com/intl/fr/guide/developing/tools/aidl.html Et un tuto bien pratique pour débuter : http://marakana.com/forums/android/android_examples/48.html Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 24 mars 2010 Share Posté(e) 24 mars 2010 (modifié) 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é 24 mars 2010 par Nivek Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
lord_ure Posté(e) 24 mars 2010 Auteur Share Posté(e) 24 mars 2010 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: Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 24 mars 2010 Share Posté(e) 24 mars 2010 débatut 50 fois.tu la colle en static ^^c'est pourri mais ça fonctionne. Je pense pas que ce soit une bonne méthode ... Autant expliquer comment faire propre parce que c'est à cause de ce genre de code pourri qu'on introduit des bugs. Regarde ce que Dekans a donné ;) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 24 mars 2010 Share Posté(e) 24 mars 2010 (modifié) 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é 24 mars 2010 par Nivek Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.