Kann nicht benutzerdefinierte Objekt in einer Absicht passieren: Die Methode Put Extra ist zweideutig für den Typ Intent

Wenn ich versuche zu schreiben

Car myCarObject=getCar(); Intent details = new Intent(Start.this, DetailsCar.class); details.putExtra("Car", myCarObject); startActivity(details); 

Eclipse zeigt mir einen Kompilationsfehler "Die Methode Put Extra ist für den Typ Intent" in der Zeile zweideutig

  details.putExtra("Car", myCarObject); 

Wenn ich den Code verwende

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

Und ich versuche, das Extra mit diesem Code in der Zielabsicht mit zu laden

 ArrayList<Car> parcelableExtra = new ArrayList<Car>(); parcelableExtra = (ArrayList<Car>) getIntent().getExtras().getParcelable("Car"); Car c=parcelableExtra.get(0); 

Ich bekomme diese Warnung

 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) 

Und die App stürzt mit einer Nullpunkt-Ausnahme ab

Mein Auto Objekt ist paketierbar

Also … was ist falsch

  • Wie man ein Array von Adressobjekten an eine andere Acitvity übergibt
  • Pass 2D-Array auf eine andere Aktivität
  • Einige paketfähige Objekte, die in einem Intent / Bündel zusammengestellt wurden, könnten sich selbst stören und das Lesen von Intent / Bundle kompromittieren?
  • Wie zu beheben Unmarshalling unbekannten Typ Code XXX bei Offset YYY in Android?
  • Android - Speichern Sie paketfähige Daten in eine Datei
  • Unmarshalling Fehler in Android App mit benutzerdefinierten Paketklassen
  • Monodroid setzen paketierbare Gegenstände zum Bündeln
  • Extrahieren Sie den Benachrichtigungstext aus Paket, ContentView oder ContentIntent
  • 4 Solutions collect form web for “Kann nicht benutzerdefinierte Objekt in einer Absicht passieren: Die Methode Put Extra ist zweideutig für den Typ Intent”

    Der erste Fehler: 'Die Methode Put Extra ist zweideutig für den Typ Intent'.

    Die Klasse Car ist sowohl Serializable als auch Parcelable , der Compiler weiß nicht, ob man putExtra(Serializable s) oder putExtra(Parcelable p) , um deine Anfrage zu bearbeiten. Also musst du dein Car bei einem Intent.putExtra() auf einen von ihnen Intent.putExtra() .

     Intent.putExtra("car", (Parcelable)myCarObject); Intent.putExtra("car", (Serializable)myCarObject); 

    Der zweite Fehler: java.lang.ClassCastException: java.util.ArrayList

    Sie setzen das Car Objekt in eine ArrayList und verwenden putExtra , um die nächste Aktivität zu senden. Eine ArrayList ist nicht Parcelable aber nur Serializable . Die putExtra(ArrayList) arbeitet als putExtra(Serializable) , aber du liest es von getParcelable() . Eine ArrayList kann nicht auf Parcelable .

    Ich benutze das

    Im Absender Activiy

     Intent intent = new Intent(activity, MyActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("my object", myObject); intent.putExtras(bundle); startActivity(intent); 

    Im Empfänger:

     myObject = (MyObject) getIntent().getExtras().getSerializable("my object"); 

    Funktioniert gut für mich versuchen es. Aber das Objekt muss serialisierbar sein 🙂

    Dies ist, wie ich meine Objekte, die serialisierbar sind, passieren, ich glaube, es sollte auf die gleiche Weise für paketierbar funktionieren. Bestehen:

     Intent intent=new Intent(OverviewActivity.this,CarDetailTabActivity.class); intent.putExtra("CAR",myCarObject); startActivity(intent); 

    Erhalten:

     Car carObject=(Car)getIntent().getSerializableExtra("CAR"); 

    Auto:

     import java.io.Serializable; public class Car implements Serializable { private static final long serialVersionUID = 1L; ...... 

    getIntent().getExtras() gibt extra Bundle aus deiner Absicht zurück, nicht deine Daten. Um deine Liste zu erhalten, bekommst du getIntent().getParcelableArrayListExtra("Car")

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.