web-dev-qa-db-fra.com

Impossible de passer un objet personnalisé dans une intention: la méthode Put Extra est ambiguë pour le type Intent

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?

37
AndreaF

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.

70
faylon

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 :)

25
Khaled Annajar

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;
......
13
slezadav

Solution: implémentez l'interface Serializable par votre classe comme implements Serializable

2
Ali Akram

getIntent().getExtras() renvoie un extra Bundle de votre intention, pas de vos données. Pour obtenir votre liste, utilisez getIntent().getParcelableArrayListExtra("Car")

1
Evos