Невозможно передать пользовательский объект в намерении: метод Put Extra является неоднозначным для типа Intent
Если я попытаюсь написать
Car myCarObject=getCar();
Intent details = new Intent(Start.this, DetailsCar.class);
details.putExtra("Car", myCarObject);
startActivity(details);
Eclipse покажет мне ошибку компиляции . Метод Put Extra неоднозначен для типа 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);
И я пытаюсь загрузить дополнительный с этим кодом в целевом намерении с помощью
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
Объект My Car Parcelable
так.... что не так?
Ответы
Ответ 1
Первая ошибка: "Метод Put Extra является неоднозначным для типа Intent".
Класс Car
равен Serializable
и Parcelable
, компилятор не знает, использовать ли 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
, а только Serializable
. putExtra(ArrayList)
работает как putExtra(Serializable)
, но вы читаете его getParcelable()
. ArrayList
нельзя отнести к Parcelable
.
Ответ 2
Я использую этот
В отправителе Activiy
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
Вот как я передаю свои объекты, которые могут быть сериализуемыми, я считаю, что он должен работать одинаково для аргументации.
Pass:
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
getIntent().getExtras()
возвращает дополнительные Bundle
из ваших намерений, а не ваши данные. Чтобы использовать ваш список getIntent().getParcelableArrayListExtra("Car")