2013-06-14 3 views
1

ALL,Как передать объект между действиями?

Рассмотрим следующую структуру данных:

class Foo 
{ 
private int m1; 
private double m2; 
}; 

class Bar 
{ 
private int m1; 
private List<Foo> m2; 
}; 

Теперь то, что я хочу сделать, это пройти Бар :: м2 с одного вида деятельности на другой. Данные в баре отображаются в списке и выбирают строку, мне нужно передать соответствующую структуру списка m2.

Каков наилучший способ сделать это? То, что я попытался это:

Intent intent = new Intent(); 
intent.putExtra("test", new ArrayList<Foo>); 

но получающее намерение бросает исключение «Parcelable: Невозможно Маршалл»

AFAICT ArrayList должен быть сериализациями, так что я не понимаю, почему я получаю исключение.

Может кто-нибудь запланировать свет здесь, пожалуйста?

спасибо.

+0

http://docs.oracle.com/javase/6/docs/api/java/util/List.html 'list' не сериализации, а метод' putExtra' на умысле принимает 'List 'не' ArrayList', поэтому ваш ArrayList воспринимается как интерфейс 'List' – Blundell

+0

Существует так много дубликатов, что мне трудно выбрать. –

+0

Dup? [Как передать объект в новую активность? (как ввести)] (http://stackoverflow.com/questions/7725840/how-to-pass-object-to-a-new-activity-how-to-inject?rq=1) (был первым Связанный вопрос) – Izkata

ответ

3

AFAICT ArrayList должны быть сериализуемыми

Да, но у вас нет ArrayList ни о чем - у вас есть ArrayList из Foo объектов.

Я не понимаю, почему я получаю исключение

Поскольку Foo не Serializable.

Эффективный ответ для вас реализовать поддержку Parcelable на Foo, а затем использовать putParcelableArrayListExtra() на вашем Intent.

Ответ на менее программируемый вопрос заключается в том, что вы должны реализовать Serializable по адресу Foo, и в этом случае ваш текущий putExra() должен работать.

+0

Ну, видимо, я был слишком быстр, чтобы принять его. ;-) Я добавил Parcelable в Foo, а затем использовал put/getParcelableArrayListExtra(). Тем не менее, я все еще получаю «Unmarshalling unknown type code». Есть идеи? – Igor

+0

@Igor: Все, что я могу предложить, - это опубликовать вашу реализацию Foo и трассировку стека. – CommonsWare

+0

Nevermind. Оно работает. Извините за шум. – Igor

1

Вы должны сделать свои пользовательские объекты Seriablizable. Вот в документации по

Serializable

1
Bundle bundle = new Bundle(); 
bundle.putSerializable("object", yourobject); 
startActivity(new Intent(this,Myclass.class).putExtras(bundle); 

ваш класс объект должен реализовать Serializable или Parcelable.

class Foo implements Serializable 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private int m1; 
    private double m2; 
}; 

class Bar implements Serializable 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private int m1; 
    private List<Foo> m2; 
}; 
Смежные вопросы