Question Comment passer un objet d'une activité à une autre sur Android


J'essaie de travailler sur l'envoi d'un objet de mon client classe d'un Activity et l'afficher dans un autre Activity.

Le code pour la classe de client:

public class Customer {

    private String firstName, lastName, Address;
    int Age;

    public Customer(String fname, String lname, int age, String address) {

        firstName = fname;
        lastName = lname;
        Age = age;
        Address = address;
    }

    public String printValues() {

        String data = null;

        data = "First Name :" + firstName + " Last Name :" + lastName
        + " Age : " + Age + " Address : " + Address;

        return data;
    }
}

Je veux envoyer son objet d'un Activity à un autre, puis afficher les données de l'autre Activity.

Comment puis-je y parvenir?


606
2018-04-29 10:06


origine


Réponses:


Une option pourrait être de laisser votre classe personnalisée implémenter le Serializable interface, puis vous pouvez passer des instances d'objet dans l'intention supplémentaire en utilisant le putExtra(Serializable..) variante du Intent#putExtra() méthode.

Pseudocode:

//To pass:
intent.putExtra("MyClass", obj);

// To retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");

Remarque: Assurez-vous que chaque classe imbriquée de votre classe personnalisée principale a implémenté l'interface Serializable pour éviter les exceptions de sérialisation. Par exemple:

class MainClass implements Serializable {

    public MainClass() {}

    public static class ChildClass implements Serializable {

        public ChildClass() {}
    }
}

721
2018-04-29 10:39



Implémentez votre classe avec Serializable. Supposons que c'est votre classe d'entité:

import java.io.Serializable;

@SuppressWarnings("serial") //With this annotation we are going to hide compiler warnings
public class Deneme implements Serializable {

    public Deneme(double id, String name) {
        this.id = id;
        this.name = name;
    }

    public double getId() {
        return id;
    }

    public void setId(double id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private double id;
    private String name;
}

Nous envoyons l'objet appelé dene de l'activité X à l'activité Y. Quelque part dans l'activité X;

Deneme dene = new Deneme(4,"Mustafa");
Intent i = new Intent(this, Y.class);
i.putExtra("sampleObject", dene);
startActivity(i);

Dans l'activité Y, nous obtenons l'objet.

Intent i = getIntent();
Deneme dene = (Deneme)i.getSerializableExtra("sampleObject");

C'est tout.


264
2017-10-19 20:19



  • Utilisation globale variables statiques n'est pas bon génie logiciel entraine toi.
  • Conversion des champs d'un objet en primitive types de données peuvent être un travail trépidant.
  • En utilisant sérialisable est OK, mais ce n'est pas performant sur la plate-forme Android.
  • Parcelable est spécifiquement conçu pour Android et vous devriez l'utiliser. Voici un exemple simple: Passer des objets personnalisés entre les activités Android

Vous pouvez générer du code parcelable pour votre classe en utilisant cette site.


103
2018-04-16 18:50



En appelant une activité

Intent intent = new Intent(fromClass.this,toClass.class).putExtra("myCustomerObj",customerObj);

Dans toClass.java recevoir l'activité par

Customer customerObjInToClass = getIntent().getExtras().getParcelable("myCustomerObj");

S'il vous plaît assurez-vous que la classe de clientèle met en œuvre parcelable

public class Customer implements Parcelable {

    private String firstName, lastName, address;
    int age;

    /* all your getter and setter methods */

    public Customer(Parcel in ) {
        readFromParcel( in );
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public LeadData createFromParcel(Parcel in ) {
            return new Customer( in );
        }

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


    @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeString(firstName);
        dest.writeString(lastName);
        dest.writeString(address);
        dest.writeInt(age);
    }

    private void readFromParcel(Parcel in ) {

        firstName = in .readString();
        lastName  = in .readString();
        address   = in .readString();
        age       = in .readInt();
    }

83
2017-08-03 08:42



Dans mon expérience, il y a trois solutions principales, chacune avec leurs inconvénients et leurs avantages:

  1. Implémentation de Parcelable

  2. Implémentation Serializable

  3. Utilisation d'une bibliothèque de bus d'événements légers (par exemple, EventBus de Greenrobot ou Otto de Square)

Parcelable - rapide et Android standard, mais il a beaucoup de code standard et nécessite des chaînes codées en dur pour référence lorsque vous extrayez des valeurs sur l'intention (non fortement typé).

Serialisable - proche de zéro, mais il s'agit de l'approche la plus lente et nécessite également des chaînes codées en dur pour extraire les valeurs de l'intention (non fortement typée).

Bus d'événement - zéro passe-partout, l'approche la plus rapide, et ne nécessite pas de chaînes codées en dur, mais il nécessite une dépendance supplémentaire (bien que généralement léger, ~ 40 Ko)

J'ai publié une comparaison très détaillée sur ces trois approches, y compris les points de référence en matière d'efficacité.


70
2017-11-18 19:36



Utilisation gson pour convertir votre objet en JSON et le transmettre par l'intention. Dans la nouvelle activité, convertissez le JSON en objet.

Dans ton build.gradle, ajoutez ceci à vos dépendances

implementation 'com.google.code.gson:gson:2.8.4'

Dans votre activité, convertissez l'objet en chaîne json:

Gson gson = new Gson();
String myJson = gson.toJson(vp);
intent.putExtra("myjson", myjson);

Dans votre activité de réception, convertissez la chaîne JSON en objet d'origine:

Gson gson = new Gson();
YourObject ob = gson.fromJson(getIntent().getStringExtra("myjson"), YourObject.class);

59
2017-10-31 07:08



Vous pouvez également écrire les données de l'objet dans des chaînes et des ints temporaires et les transmettre à l'activité. Bien sûr, les données sont transportées, mais pas l'objet lui-même.

Mais si vous voulez juste les afficher, et ne pas utiliser l'objet dans une autre méthode ou quelque chose comme ça, cela devrait suffire. Je l'ai fait de la même manière pour afficher simplement les données d'un objet dans une autre activité.

String fName_temp   = yourObject.getFname();
String lName_temp   = yourObject.getLname();
String age_temp     = yourObject.getAge();
String address_temp = yourObject.getAddress();

Intent i = new Intent(this, ToClass.class);
i.putExtra("fname", fName_temp);
i.putExtra("lname", lName_temp);
i.putExtra("age", age_temp);
i.putExtra("address", address_temp);

startActivity(i);

Vous pouvez aussi les passer directement au lieu des ivars temp, mais de cette façon, c'est plus clair, à mon avis. En outre, vous pouvez définir les ivars de température à null afin qu'ils soient nettoyés plus tôt par le GarbageCollector.

Bonne chance!

Sur une note de côté: remplacer toString () au lieu d'écrire votre propre méthode d'impression.

Comme mentionné dans les commentaires ci-dessous, voici comment vous récupérez vos données dans une autre activité:

String fName = getIntent().getExtras().getInt("fname");

37
2018-04-29 11:27