Aller au contenu

Problème intent.putExtra


HeyGuadah

Recommended Posts

Bonjour amis développeurs !

J'ouvre un petit post aujourd'hui car j'aurais besoin d'un petit conseil.

J'ai créé une classe user dans une application. Cette classe sera remplit au fur et à mesure des activité qui la compose pour finalement être affiché dans la dernière activité.

Pour la création de la classe, tous c'est très bien passé mais j'ai un petit soucis dans le intent.putExtra de mes activités...

Je vous montre mes petits bouts de codes.

 

La classe User

package com.example.shiin.loginregisteralpha;

import android.os.Parcel;
import android.os.Parcelable;

public class User
{
private String mName;
private String mFirstName;
private String mDate;
private String mSexe;
private String mMdp;
private String mMail;
private String mSexeFind;
private String mCity;
private String mCountry;
private String mCountryId;


public User(String Name, String FirstName,
String Date, String Sexe, String Mdp,
String Mail, String SexeFind, String City, String Country, String CountryId)
{
super();
this.mName = Name;
this.mFirstName = FirstName;
this.mDate = Date;
this.mSexe = Sexe;
this.mMdp = Mdp;
this.mMail = Mail;
this.mSexeFind = SexeFind;
this.mCity = City;
this.mCountry = Country;
this.mCountryId = CountryId;
}

public User(Parcel in) {
this.mName = in.readString();
this.mFirstName = in.readString();
this.mDate = in.readString();
this.mSexe = in.readString();
this.mMdp = in.readString();
this.mMail = in.readString();
this.mSexeFind = in.readString();
this.mCity = in.readString();
this.mCountry = in.readString();
this.mCountryId = in.readString();
}

public int describeContents()
{
return 0;
}

public void writeToParcel(Parcel dest, int flags)
{
dest.writeString(mName);
dest.writeString(mFirstName);
dest.writeString(mDate);
dest.writeString(mSexe);
dest.writeString(mMdp);
dest.writeString(mMail);
dest.writeString(mSexeFind);
dest.writeString(mCity);
dest.writeString(mCountry);
dest.writeString(mCountryId);
}

public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>()
{
@[member="override"]
public User createFromParcel(Parcel source)
{
return new User(source);
}

@[member="override"]
public User[] newArray(int size)
{
return new User[size];
}
};

public String getmName()
{
return mName;
}

public String getmFirstName()
{
return mFirstName;
}

public String gemDate()
{
return mDate;
}

public String getmSexe()
{
return mSexe;
}

public String getmMdp()
{
return mMdp;
}

public String getmMail()
{
return mMail;
}

public String getmSexeFind()
{
return mSexeFind;
}

public String getmCity()
{
return mCity;
}

public String getmCountry()
{
return mCountry;
}

public String getmCountryId()
{
return mCountryId;
}

public static Parcelable.Creator<User> getCreator()
{
return CREATOR;
}


}

Le fragment d'envoie de donnée de mon activité d'envoi

User user = new User(name, firstname, null, null, null, null, null, null, null, null);
Intent intent = new Intent(getApplicationContext(), RegisterBirth.class);
intent.putExtra("user", user);
startActivity(intent);

Le code d'erreur

Error:(38, 23) error: no suitable method found for putExtra(String,User)
method Intent.putExtra(String,boolean) is not applicable
(argument mismatch; User cannot be converted to boolean)
method Intent.putExtra(String,byte) is not applicable
(argument mismatch; User cannot be converted to byte)
method Intent.putExtra(String,char) is not applicable
(argument mismatch; User cannot be converted to char)
method Intent.putExtra(String,short) is not applicable
(argument mismatch; User cannot be converted to short)
method Intent.putExtra(String,int) is not applicable
(argument mismatch; User cannot be converted to int)
method Intent.putExtra(String,long) is not applicable
(argument mismatch; User cannot be converted to long)
method Intent.putExtra(String,float) is not applicable
(argument mismatch; User cannot be converted to float)
method Intent.putExtra(String,double) is not applicable
(argument mismatch; User cannot be converted to double)
method Intent.putExtra(String,String) is not applicable
(argument mismatch; User cannot be converted to String)
method Intent.putExtra(String,CharSequence) is not applicable
(argument mismatch; User cannot be converted to CharSequence)
method Intent.putExtra(String,Parcelable) is not applicable
(argument mismatch; User cannot be converted to Parcelable)
method Intent.putExtra(String,Parcelable[]) is not applicable
(argument mismatch; User cannot be converted to Parcelable[])
method Intent.putExtra(String,Serializable) is not applicable
(argument mismatch; User cannot be converted to Serializable)
method Intent.putExtra(String,boolean[]) is not applicable
(argument mismatch; User cannot be converted to boolean[])
method Intent.putExtra(String,byte[]) is not applicable
(argument mismatch; User cannot be converted to byte[])
method Intent.putExtra(String,short[]) is not applicable
(argument mismatch; User cannot be converted to short[])
method Intent.putExtra(String,char[]) is not applicable
(argument mismatch; User cannot be converted to char[])
method Intent.putExtra(String,int[]) is not applicable
(argument mismatch; User cannot be converted to int[])
method Intent.putExtra(String,long[]) is not applicable
(argument mismatch; User cannot be converted to long[])
method Intent.putExtra(String,float[]) is not applicable
(argument mismatch; User cannot be converted to float[])
method Intent.putExtra(String,double[]) is not applicable
(argument mismatch; User cannot be converted to double[])
method Intent.putExtra(String,String[]) is not applicable
(argument mismatch; User cannot be converted to String[])
method Intent.putExtra(String,CharSequence[]) is not applicable
(argument mismatch; User cannot be converted to CharSequence[])
method Intent.putExtra(String,Bundle) is not applicable
(argument mismatch; User cannot be converted to Bundle)


Ça risque peut-être de vous sembler élémentaires mais je tourne en rond depuis plusieurs heures, je pense passer à coté de quelque chose....

Merci d'avance pour vos réponses !


 

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

Salut, 

 

l'erreur provient du fait que la méthode putExtra ne sait pas recevoir ton objet User.

Il faut que tu implémentes ta classe User comme "Serializable", et là bingo, tu peux la passer via putExtra. 

     -> public class User implements Serializable

Après, tu ajoutes les éléments manquants (l'import pour Serializable et l'identifier -choisis "generated")

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse, effectivement il manquait l’implémentation de l'interface !

J'aurais juste une dernière question lié à mon cas, est-ce que je m'y prends bien pour récupérer mes données de ma classe User ? Malheureusement l'application crash lorsque j'arrive sur la layout de récupération des informations !

 

Mon code de récupération 

User user = getIntent().getExtras().getParcelable("user"); //Ligne concernée par l'erreur en question
TextView displayUser = (TextView) findViewById(R.id.textView2);
displayUser.setText("Name : " + user.getmName() + "\n" + "Firstname : " + user.getmFirstName());

Mon erreur

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference


Merci par avance !

Lien vers le commentaire
Partager sur d’autres sites

getParcelable est dédié à récupérer des objets Parcelable. Ce qui n'est pas ton cas puisque ta classe User est Serializable.

 

La classe Intent définit la méthode getSerializableExtra

En retour, il me semble que tu as un objet Serializable, pas ton objet User. (à vérifier au debugger). Si c'est le cas, lis cette doc: http://developer.android.com/reference/java/io/Serializable.html

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta réponse, effectivement j'ai eu en retour un objet Serializable.

De plus, c'était une erreur de ma part de ne pas avoir tester mon objet au préalable.

J'ai donc modifié mon code et je me suis rendu compte que mon objet était bien null.

public class F extends AppCompatActivity {

@[member=override]
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_F);

TextView displayUser = (TextView) findViewById(R.id.textView2); Bundle bundle = getIntent().getExtras(); if (bundle != null) {
User user = bundle.getParcelable("user");
displayUser.setText("Name : " + user.getmName() + "\n" + "Firstname : " + user.getmFirstName());
} else {
displayUser.setText("Name : Null" + "\n" + "Firstname : Null");
} 
}
}

J'ai donc un problème lors de mon envoi de données.

Pour mieux expliquer mon projet, j'ai plusieurs activités qui récupère chacune une ou plusieurs informations qui seront affiché dans la dernière activité. Voici mon ligne de code dans l'activité A, juste avant l'activité B. Les informations enregistré dans A, B, ..., devront être affiché dans mon activité F.

public void onClick(View v) {
final String name = til_name.getEditText().getText().toString().trim();
final String firstname = til_firstname.getEditText().getText().toString().trim();

User user = new User(name, firstname);
Intent intent = new Intent(getApplicationContext(), B.class);
intent.putExtra("user", user);
startActivity(intent);


J'ai lut partout qu'il fallait utiliser les intents pour enregistrer mes données dans ma classe User mais j'ai l'impression que ce n'est pas l'utilisation optimale quand on a plusieurs activité intermédiaire entre l'activité d'enregistrement et l'activité d'affichage.

Avez-vous des idées pour m'aider ?

Je vous remercie par avance.

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...