Как отправить объект из импортированного пакета в другой Activty

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