【问题标题】:Cannot pass custom Object in an Intent: The Method Put Extra is Ambiguous for the type Intent无法在 Intent 中传递自定义对象:方法 Put Extra 对于 Intent 类型不明确
【发布时间】:2012-12-02 13:20:27
【问题描述】:

如果我尝试写作

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

Eclipse 向我显示编译错误 “The Method Put Extra is Ambiguous for the type Intent” 行中

  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)

应用程序因空点异常而崩溃

我的 Car 对象是 Parcelable

所以....怎么了?

【问题讨论】:

    标签: android android-intent parcelable serializable


    【解决方案1】:

    第一个错误:'The Method Put Extra is Ambiguous for the type Intent'。

    Car 类同时是SerializableParcelable,编译器不知道是使用putExtra(Serializable s) 还是putExtra(Parcelable p) 来处理您的请求。因此,在使用Intent.putExtra() 时,您必须将Car 转换为其中之一。

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

    第二个错误:java.lang.ClassCastException: java.util.ArrayList

    您将Car 对象放入ArrayList 并使用putExtra 发送到下一个活动。 ArrayList 不是Parcelable,而只是SerializableputExtra(ArrayList)putExtra(Serializable) 一样工作,但您通过 getParcelable() 阅读它。 ArrayList 不能转换为 Parcelable

    【讨论】:

    • 在 Kotlin 中:myCarObject as ParcelablemyCarObject as Serializable
    【解决方案2】:

    我用这个

    在发件人活动中

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

    对我来说很好,试试吧。但是对象必须是可序列化的:)

    【讨论】:

      【解决方案3】:

      这就是我传递可序列化对象的方式,我相信它应该以相同的方式处理可打包对象。 通过:

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

      【讨论】:

        【解决方案4】:

        解决方案:通过你的类实现Serializable接口,如implements Serializable

        【讨论】:

          【解决方案5】:

          getIntent().getExtras() 从您的意图返回额外的Bundle,而不是您的数据。要获取您的列表,请使用getIntent().getParcelableArrayListExtra("Car")

          【讨论】:

            猜你喜欢
            • 2018-12-30
            • 1970-01-01
            • 1970-01-01
            • 2014-12-27
            • 1970-01-01
            • 2014-06-04
            • 1970-01-01
            • 1970-01-01
            • 2012-10-01
            相关资源
            最近更新 更多