web-dev-qa-db-ja.com

Intentでカスタムオブジェクトを渡すことができません:メソッドPut ExtraがIntent型に対してあいまいです

書き込もうとしたら

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

Eclipseは私にコンパイルエラーを表示します「メソッドプットエクストラはタイプインテントに対して曖昧です」

  details.putExtra("Car", myCarObject);

コードを使用する場合

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

そして、私は次のように宛先Intentにこのコードを追加してロードしようとします

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

この警告が表示されます

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)

そして、Null Point Exceptionでアプリがクラッシュします

私の車オブジェクトはパーセル可能です

だから....何が悪いの?

37
AndreaF

最初のエラー: 'Intent型のExtraメソッドはあいまいです'

クラスCarSerializableParcelableの両方であり、コンパイラはputExtra(Serializable s)またはputExtra(Parcelable p)を使用して処理するかどうかを知りませんあなたの要求。したがって、Intent.putExtra()を使用する場合は、Carをそれらの1つにキャストする必要があります。

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

2番目のエラー:Java.lang.ClassCastException:Java.util.ArrayList

CarオブジェクトをArrayListに配置し、putExtraを使用して次のアクティビティに送信します。 ArrayListParcelableではなく、Serializableのみです。 putExtra(ArrayList)putExtra(Serializable)として機能しますが、getParcelable()で読むことができます。 ArrayListParcelableにキャストできません。

70
faylon

これを使う

送信者のアクティビティで

Intent intent = new Intent(activity, MyActivity.class);

Bundle bundle = new Bundle();
bundle.putSerializable("my object", myObject);

intent.putExtras(bundle);

startActivity(intent);

受信機で:

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

私のためにうまく動作します。しかし、オブジェクトはシリアライズ可能でなければなりません:)

25
Khaled Annajar

これが、シリアライズ可能なオブジェクトを渡す方法です。パーセル可能にも同じように動作するはずです。パス:

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

受信:

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

車:

import Java.io.Serializable;

public class Car implements Serializable {

private static final long serialVersionUID = 1L;
......
13
slezadav

解決策implements SerializableのようなクラスによってSerializableインターフェイスを実装します

2
Ali Akram

getIntent().getExtras()は、データではなく、意図から余分なBundleを返します。リストを取得するには、getIntent().getParcelableArrayListExtra("Car")を使用します

1
Evos