Problème intent.putExtra

  • Réponses :6
  • Répondu
Hey Guadah
  • Posts de Forum 5

20 nov. 2015 à 10:23:39 via site

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>()
    {
        @Override
        public User createFromParcel(Parcel source)
        {
            return new User(source);
        }

        @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 !

Répondre
Compte désactivé
  • Posts de Forum 23

20 nov. 2015 à 11:24:43 via site

Salut,

la méthode putExtra ne sait pas recevoir ta classe "User" puisqu'elle ne figure pas dans les types connus (tu as la liste dans le log).

Ta classe User doit implémenter "Serializable" afin que la méthode putExtra puisse la traiter.

Répondre
Hey Guadah
  • Posts de Forum 5

20 nov. 2015 à 11:42:11 via site

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 !

Répondre
Compte désactivé
  • Posts de Forum 23

20 nov. 2015 à 12:04:01 via site

Comme ta classe User est Serializable, tu dois utiliser Intent.getSerializableExtra

Si ton retour est un Serializable au lieu d'un User (à confirmer au debugger), lis cette doc: http://developer.android.com/reference/java/io/Serializable.html

Répondre
Hey Guadah
  • Posts de Forum 5

20 nov. 2015 à 12:53:13 via site

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 {

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

Répondre
Compte désactivé
  • Posts de Forum 23

20 nov. 2015 à 13:05:04 via site

Effectivement, balader ses objets d'intent en en intent, c'est pas le plus efficace (en terme de coding au moins)

Perso, je ferais une classe Singleton pour stocker les informations au fur et à mesure des intents.

Répondre
Hey Guadah
  • Posts de Forum 5

22 nov. 2015 à 02:11:37 via site

Merci beaucoup pour tes réponses, le problème est résolu !

Répondre