Question Comment envoyer un objet d'une activité Android à une autre via Intents?


Comment puis-je passer un objet d'un type personnalisé d'un Activité à l'autre en utilisant le putExtra() méthode de la classe Intention?


743


origine


Réponses:


Si vous ne faites que passer des objets Parcelable a été conçu pour cela. Cela demande un peu plus d'efforts que d'utiliser la sérialisation native de Java, mais c'est beaucoup plus rapide (et je veux dire, FAÇON plus rapide).

De la docs, un exemple simple pour la mise en œuvre est:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

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

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

Observez que dans le cas où vous avez plus d'un champ à extraire d'une parcelle donnée, vous devez le faire dans le même ordre que vous l'avez placé (c'est-à-dire dans une approche FIFO).

Une fois que vous avez vos objets mis en œuvre Parcelable c'est juste une question de les mettre dans votre Intents avec putExtra ():

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

Ensuite, vous pouvez les retirer avec getParcelableExtra ():

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

Si votre classe d'objets implémente Parcelable et Serializable, assurez-vous de lancer l'un des rôles suivants:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

683



Vous devrez sérialiser votre objet dans une sorte de représentation sous forme de chaîne. Une représentation de chaîne possible est JSON, et l'un des moyens les plus faciles à sérialiser vers / à partir de JSON dans Android, si vous me demandez, est à travers Google GSON.

Dans ce cas, vous devez mettre la valeur de retour de la chaîne de (new Gson()).toJson(myObject); et récupère la valeur de chaîne et utilise fromJson pour le retourner dans votre objet.

Cependant, si votre objet n'est pas très complexe, il ne vaut peut-être pas la peine de le faire, et vous pourriez envisager de passer les valeurs séparées de l'objet à la place.


160



Vous pouvez envoyer un objet sérialisable par intention

// send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
} 

142



Pour les situations où vous savez que vous allez transmettre des données dans une application, utilisez "globals" (comme les classes statiques)

Ici c'est quoi Dianne Hackborn (hackbod - un ingénieur Google Android Software) avait à dire sur le sujet:

Pour les situations où vous savez que les activités fonctionnent dans le même   processus, vous pouvez simplement partager des données à travers les globales. Par exemple, vous   pourrait avoir un global HashMap<String, WeakReference<MyInterpreterState>>   et quand vous faites un nouveau MyInterpreterState trouver un nom unique   pour cela et le mettre dans la carte de hachage; pour envoyer cet état à un autre   activité, il suffit de mettre le nom unique dans la carte de hachage et lorsque le   deuxième activité est démarrée, il peut récupérer le MyInterpreterState de   la carte de hachage avec le nom qu'elle reçoit.


63



Votre classe devrait implémenter Serializable ou Parcelable.

public class MY_CLASS implements Serializable

Une fois cela fait, vous pouvez envoyer un objet sur putExtra

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

Pour obtenir des extras, il suffit de faire

Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");

Si votre classe implémente l'utilisation Parcelable suivante

MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");

J'espère que ça aide: D


46



si votre classe d'objets implémente Serializable, vous n'avez rien d'autre à faire, vous pouvez passer un objet sérialisable.
 C'est ce que j'utilise.


27



Réponse courte pour un besoin rapide

1. Implémentez votre classe à Serializable. 

Si vous avez des classes internes, n'oubliez pas de les implémenter à Serializable aussi !!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. Mettez votre objet à Intention 

 Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

3. Et recevez votre objet dans l'autre classe d'activité

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");

24