124 votes

Android : Comment passer un objet d’une activité à l’autre ?

J’ai besoin d’être en mesure d’utiliser un objet à plusieurs activités au sein de mon application, et il doit être le même objet. Quelle est la meilleure façon de le faire ?

J’ai essayé de faire l’objet « public static » donc on peut y accéder par d’autres activités, mais pour une raison quelconque, que ce n’est pas juste il coupe. Y a-t-il d’autres moyens d’y parvenir ?

140voto

anargund Points 1468

Lorsque vous créez un objet d'intention, vous pouvez profiter de l'une des deux méthodes suivantes pour les objets de passage entre les deux activités.

putParceble

putSerializable

Ce que vous pouvez faire avec cela, c'est avoir votre classe en œuvre du Parcelable ou Serializable.

Ensuite, vous pouvez passer autour de vos classes personnalisées de différentes activités. J'ai trouvé cela très utile.

Voici un petit extrait de code, je suis en utilisant

CustomListing currentListing = new CustomListing();
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelable(Constants.CUSTOM_LISTING, currentListing);
i.putExtras(b);
i.setClass(this, SearchDetailsActivity.class);
startActivity(i);

Et dans le nouveau code d'activité sera quelque chose comme cela...

Bundle b = this.getIntent().getExtras();
if(b!=null)
    mCurrentListing = b.getParcelable(Constants.CUSTOM_LISTING);

37voto

Erich Douglass Points 21714

Vous pouvez créer une sous-classe d’Application et de stocker votre objet partagé il. L’objet de la demande devrait exister pour la durée de vie de votre application tant qu’il y a certains composant actif.

De vos activités, vous pouvez accéder à l’objet de la demande via `` .

36voto

Subin Sebastian Points 2387

Toutes les réponses ci-dessus contient des solutions valables à cette situation. D'autre part, cette réponse est spécifique, dans le cas où si ces objets avec des types de données, ou dans le cas si la structure de classe est imbriqué. Avec une classe imbriquée structure, rendant parceleable ou searalizeable est un peu fastidieux.

class Myclass    {
  int attr_e;
  class SubClass    {
       int attr_ex;
  }
}

Dans ces types de cas, vous pouvez utiliser l'aise JSON en fonction de la solution. Avec le Google GSON de la bibliothèque, vous pouvez directement analyser un objet en JSON représentation et de les convertir à l'objet represetnation.

MyClass src = new MyClass();
Gson gS = new Gson();
String target = gS.toJson(src);

Ensuite, vous pouvez facilement envoyer à travers des activités comme une chaîne de caractères à l'aide de la putExtra() la méthode comme suit.

i.putExtra("MyObjectAsString", target);

Ensuite, à la réception d'activité, vous pouvez lire au dos de l'Objet comme suit.

String src = getIntent().getStringExtra("MyObjectAsString");
MyClass target = gS.fromJson(src, MyClass.class);

Il garde les classes d'origine propre et réutilisable. Au-dessus de tout, si ces objets de la classe vient de le web sous forme d'objets JSON, c'est précisément la solution à utiliser.

6voto

CaseyB Points 16014

Il dépend du type de données, à que vous devez accéder. Si vous avez une sorte de base de données qu’il faut persister à travers s alors réponse Erich est le chemin à parcourir. Si vous avez juste besoin de passer des quelques objets d’une activité à l’autre, alors vous pouvez les faire mettre en œuvre et passez-les dans les extras de la pour commencer la nouvelle .

6voto

Fedor Points 29890

Votre objet peut également implémenter interface Parcelable. Ensuite, vous pouvez utiliser la méthode Bundle.putParcelable() et passez votre objet entre les activités au sein de l’intention. Photostream application utilise cette approche et peut être utilisée comme une référence http://code.google.com/p/apps-for-android/.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X