Si j'essaye d'écrire
Car myCarObject=getCar();
Intent details = new Intent(Start.this, DetailsCar.class);
details.putExtra("Car", myCarObject);
startActivity(details);
Eclipse me montre une erreur de compilation "La méthode Put Extra est ambiguë pour le type Intent" dans la ligne
details.putExtra("Car", myCarObject);
Si j'utilise le code
Car myCarObject=getCar();
ArrayList<Car> parcelableExtra = new ArrayList<Car>();
parcelableExtra.add(myCarObject);
Intent details = new Intent(Start.this, DetailsCar.class);
details.putExtra("Car", parcelableExtra);
startActivity(dettagli);
Et j'essaie de charger le supplément avec ce code dans l'intention de destination avec
ArrayList<Car> parcelableExtra = new ArrayList<Car>();
parcelableExtra = (ArrayList<Car>) getIntent().getExtras().getParcelable("Car");
Car c=parcelableExtra.get(0);
Je reçois cet avertissement
12-14 05:30:07.669: W/Bundle(19823): Key Car expected Parcelable but value was a Java.util.ArrayList. The default value <null> was returned.
12-14 05:30:07.679: W/Bundle(19823): Attempt to cast generated internal exception:
12-14 05:30:07.679: W/Bundle(19823): Java.lang.ClassCastException: Java.util.ArrayList
12-14 05:30:07.679: W/Bundle(19823): at Android.os.Bundle.getParcelable(Bundle.Java:1106)
12-14 05:30:07.679: W/Bundle(19823): at my.app.com.DetailsCar.onCreate(DetailsCar.Java:43)
12-14 05:30:07.679: W/Bundle(19823): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
12-14 05:30:07.679: W/Bundle(19823): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1615)
12-14 05:30:07.679: W/Bundle(19823): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1667)
12-14 05:30:07.679: W/Bundle(19823): at Android.app.ActivityThread.access$1500(ActivityThread.Java:117)
12-14 05:30:07.679: W/Bundle(19823): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:935)
12-14 05:30:07.679: W/Bundle(19823): at Android.os.Handler.dispatchMessage(Handler.Java:99)
12-14 05:30:07.679: W/Bundle(19823): at Android.os.Looper.loop(Looper.Java:130)
12-14 05:30:07.679: W/Bundle(19823): at Android.app.ActivityThread.main(ActivityThread.Java:3687)
12-14 05:30:07.679: W/Bundle(19823): at Java.lang.reflect.Method.invokeNative(Native Method)
12-14 05:30:07.679: W/Bundle(19823): at Java.lang.reflect.Method.invoke(Method.Java:507)
12-14 05:30:07.679: W/Bundle(19823): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:867)
12-14 05:30:07.679: W/Bundle(19823): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:625)
12-14 05:30:07.679: W/Bundle(19823): at dalvik.system.NativeStart.main(Native Method)
12-14 05:30:07.679: W/dalvikvm(19823): threadid=1: thread exiting with uncaught exception (group=0x40018578)
Et l'application se bloque avec une exception de point nul
Mon objet Car est Parcelable
alors ... qu'est-ce qui ne va pas?
La première erreur: 'La méthode Put Extra est ambiguë pour le type Intent'.
La classe Car
est à la fois Serializable
et Parcelable
, le compilateur ne sait pas s'il faut utiliser putExtra(Serializable s)
ou putExtra(Parcelable p)
pour gérer votre demande. Vous devez donc convertir votre Car
en l'un d'eux lorsque vous utilisez Intent.putExtra()
.
Intent.putExtra("car", (Parcelable)myCarObject);
Intent.putExtra("car", (Serializable)myCarObject);
La deuxième erreur: Java.lang.ClassCastException: Java.util.ArrayList
Vous placez l'objet Car
dans un ArrayList
et utilisez putExtra
pour envoyer à l'activité suivante. Un ArrayList
n'est pas Parcelable
mais seulement Serializable
. La putExtra(ArrayList)
fonctionne comme putExtra(Serializable)
, mais vous la lisez par getParcelable()
. Un ArrayList
ne peut pas être converti en Parcelable
.
J'utilise ceci
Dans l'expéditeur Activiy
Intent intent = new Intent(activity, MyActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("my object", myObject);
intent.putExtras(bundle);
startActivity(intent);
Dans le récepteur:
myObject = (MyObject) getIntent().getExtras().getSerializable("my object");
Fonctionne bien pour moi l'essayer. Mais l'objet doit être sérialisable :)
C'est ainsi que je passe mes objets qui sont sérialisables, je pense que cela devrait fonctionner de la même manière pour les colis. Passer:
Intent intent=new Intent(OverviewActivity.this,CarDetailTabActivity.class);
intent.putExtra("CAR",myCarObject);
startActivity(intent);
Recevoir:
Car carObject=(Car)getIntent().getSerializableExtra("CAR");
Voiture:
import Java.io.Serializable;
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
......
Solution: implémentez l'interface Serializable
par votre classe comme implements Serializable
getIntent().getExtras()
renvoie un extra Bundle
de votre intention, pas de vos données. Pour obtenir votre liste, utilisez getIntent().getParcelableArrayListExtra("Car")