#java #android #android-intent #google-api
#java #Android #android-намерение #google-api
Вопрос:
Я выполнил действие (A), которое восстанавливает List<Event>
из Google Calendar API в AsyncTask, а затем отправляет его из (A) в (B). Список не является пустым при помещении его в пакет:
bundle.putSerializable(KEY_EVENTS_LIST, (Serializable) items);
но это значение равно нулю, когда я восстанавливаю его в (B)
Bundle b = getIntent().getExtras();
eventList = (List<Event>) b.getSerializable(MainActivity.KEY_EVENTS_LIST);
Я не знаю, каким другим способом я мог бы отправить его из (A) в (B), или если бы я мог отправить список непосредственно в B из AsyncTask.
Комментарии:
1. проверьте, является ли класс события серилизуемым.
2. @NoumanCh нет, это не так и не подлежит пересылке
3. Добавляете ли вы пакет в свои намерения перед началом действия B?
4. @BenoitTH да, и я правильно получаю пакет в B. Но восстановленный объект равен нулю
Ответ №1:
Вы можете отправить сериализованный список массивов (ArrayList), используя намерение из действия A в действие B
Intent intent = new Intent(context, B.class);
intent.putExtra("list", serializedArrayListObject);
activity.startActivity(intent);
В действии B в методе onCreate
ArrayList<Event> list=getIntent().getSerializableExtra("list");
чтобы получить список из намерения
Комментарии:
1. Это отлично сработало, спасибо!! Единственная проблема, с которой я столкнулся сейчас, заключается в том, что при выполнении for со списком и установке значения из списка
Event e = eventList.get(i);
переходыClassCastException: java.util.HashMap cannot be cast to com.google.api.services.calendar.model.Event
, но при выполненииfor
in (A) все работает нормально2. Привет, Эрик Кристиан Пардо, вы четко сказали, что он импортирует com.google.api.services.calendar.model. Класс событий, но вам нужно импортировать класс событий, который создан вами в local, поэтому удалите этот импорт и импортируйте свой локальный класс событий. у меня есть одно предложение, есть много встроенных в событие классов, поэтому вам лучше изменить имя класса на некоторые другие имена, например, CustomEvent
Ответ №2:
Обходной путь, который вы можете предпринять для решения этой проблемы, создает Event
класс в вашем проекте со всеми атрибутами Event
класса (другого пакета) и делает ваш класс событий паракализуемым.
Перед установкой list в bundle преобразуйте его в свой список и передайте этот список.
Это не очень хорошее решение, но, насколько мне известно, оно будет работать идеально. Надеюсь, это поможет вам.
Ответ №3:
Если вы хотите сохранить список в фоновом режиме при отправке его в другое действие, вы можете использовать SharedPreferences для этого, как показано ниже:-
1) Вы не можете напрямую сохранить ArrayList в SharedPreferences, поэтому вам нужно сначала преобразовать его в set с помощью:-
Set<String> set = new HashSet<String>();
set.addAll(Your_ArrayList);
2) Сохраните его, используя SharedPreferences:-
SharedPreferences.Editor editor = getSharedPreferences(MY_PREF_STRING, MODE_PRIVATE).edit();
editor.putStringSet("Key", set);
editor.apply();
где MY_PREF_STRING
объявляется глобально как public static final String MY_PREF_STRING = "MY_PREF";
Извлеките это с помощью
1) В другом действии, где вы хотите получить это, просто вставьте приведенный ниже код:-
SharedPreferences preferences = getSharedPreferences(MY_PREF, MODE_PRIVATE);
Set<String> set2 = new HashSet<String>();
set2 = preferences.getStringSet("Key", Collections.singleton("0"));
2) Вы можете снова преобразовать это в ArrayList с помощью:-
ArrayList<String> array = new ArrayList<String>();
array.addAll(set2);