#android #android-intent
#Android #android-намерение
Вопрос:
как десериализовать этот тип:
public Intent putExtra(String name, Serializable value)
пример:
intent.putExtra("activityToPass", GoToThisActivity.class);
???
getIntent().getExtras.getSerializable("activityToPass");
как это сделать, пожалуйста;
пожалуйста, помогите!!
Ответ №1:
Если вы хотите передать пользовательский объект из одного действия в другое, сначала у вас должен быть класс вашего пользовательского объекта для реализации java.io.Serializable
:
public class SomeObject implements Serializable {
private String name;
public SomeObject (final String name) {
this.name = name;
}
[...]
}
final SomeObject myExtra = new SomeObject("any name");
Затем вы можете добавить этот myExtra к намерению, с которым вы вызываете свой новый Activity
:
final Intent intent = new Intent(this, GoToThisActivity.class);
intent.putExtra("serializedExtra", myExtra);
startActivity(intent);
Внутри метода вашего GoToThisActivity
класса’ onCreate
вы можете извлечь это дополнительное как:
final Intent intent = getIntent();
if (intent.hasExtra("serializedExtra"))
final SomeObject myExtra= (SomeObject)intent.
getSerializableExtra("serializedExtra");
[...]
}
И теперь у вас есть свой пользовательский объект в вашем новом действии.
Обновление 1: Передача класса другому действию с Intent
Если вы хотите передать Class
экземпляр намерению:
intent.putExtra("classExtra", GoToThisActivity.class);
и десериализовать его в другом действии:
if (intent.hasExtra("classExtra"))
{
final Class<?> classExtra= (Class<?>)intent.
getSerializableExtra("classExtra");
[...]
}
Обновление 2:
При десериализации массива пользовательских объектов вы должны убедиться, что элементы в этом массиве реализуют Serializable
интерфейс.
Чтобы оставаться в своем примере:
public class ButtonPick implements Serializable
{
public static final ButtonPick EDIT = new ButtonPick();
public static final ButtonPick DELETE = new ButtonPick();
}
Вы добавляете лишнее в Intent
:
intent.putExtra("buttonPicks", new ButtonPick[]
{ButtonPick.DELETE,ButtonPick.EDIT});
И внутри другого действия десериализует его:
if (intent.hasExtra("buttonPicks"))
{
final Object[] buttonPicks= (Object[])intent.
getSerializableExtra("buttonPicks");
[...]
}
Вы ДОЛЖНЫ привести массив как Object[]
независимо от исходного значения ButtonPicks[]
.
Элементы внутри массива имеют свой правильный тип, поэтому внутри находятся
{ Кнопки выбора.РЕДАКТИРОВАТЬ, нажимать кнопки.УДАЛИТЬ }
Участники.
Вам нужно привести их по отдельности.
Комментарии:
1. как насчет передачи класса через serializable?, я больше не хочу создавать пользовательские объекты. пример: intent.putExtra(«activityToPass», GoToThisActivity.class ), поскольку для Java, GoToThisActivity.class является сериализуемым! Спасибо.
2. извините, я просто перепрыгнул через эту часть по ошибке, но, пожалуйста, ознакомьтесь с моим обновлением для передачи класса.
3. попробуем это освоить по рекашеру!
4. последний вопрос, сенсей, как десериализовать это, пока безуспешно: intent.putExtra(«buttonPicks», new ButtonPick[]{Кнопка выбора. УДАЛИТЬ, выбрать кнопку. РЕДАКТИРОВАТЬ} ); //где ButtonPick — это перечисление. Нужно ли мне создавать пользовательский объект для этого?
5. я опубликовал новое обновление с примером того, как десериализовать массивы, надеюсь, у вас это сработает.