9 ответов:
вы можете найти некоторые примеры этого здесь,здесь (код взят здесь) и здесь.
вы можете создать класс POJO для этого, но вам нужно добавить дополнительный код, чтобы сделать его Parcelable. Посмотрим на реализацию.
public class Student implements Parcelable{ private String id; private String name; private String grade; // Constructor public Student(String id, String name, String grade){ this.id = id; this.name = name; this.grade = grade; } // Getter and setter methods ......... ......... // Parcelling part public Student(Parcel in){ String[] data = new String[3]; in.readStringArray(data); // the order needs to be the same as in writeToParcel() method this.id = data[0]; this.name = data[1]; this.grade = data[2]; } @Оverride public int describeContents(){ return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeStringArray(new String[] {this.id, this.name, this.grade}); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public Student createFromParcel(Parcel in) { return new Student(in); } public Student[] newArray(int size) { return new Student[size]; } }; }после того, как вы создали этот класс, вы можете легко передать объекты этого класса через намерение, как это, и восстановить этот объект в целевом объекте деятельность.
intent.putExtra("student", new Student("1","Mike","6"));здесь студент-это ключ, который вам потребуется, чтобы распаковать данные из пакета.
Bundle data = getIntent().getExtras(); Student student = (Student) data.getParcelable("student");в этом примере показаны только строковые типы. Но, вы можете посылать любые данные, которые вы хотите. Попробовать ее.
редактировать: еще один пример, предложил Рукмал Диас.
IntelliJ IDEA и Android Studio есть плагины для этого:
- ★ Android Parcelable генератор кода (Apache лицензия 2.0)
- Авто Участок (MIT лицензия)
- SerializableParcelable Генератор (MIT лицензия)
- Parcelable генератор кода (для Kotlin) (Apache лицензия 2.0)
эти плагины генерируют Android Parcelable boilerplate кода на основе полей в классе.
как? С аннотациями.
вы просто аннотировать POJO со специальной аннотацией и библиотека делает все остальное.
предупреждение!
я не уверен, что Hrisey, Lombok и другие библиотеки генерации кода совместимы с новой системой сборки Android. Они могут или не могут хорошо играть с кодом горячей замены (т. е. jRebel, Instant Run).
плюсы:
- библиотеки генерации кода вам сэкономить из исходного кода шаблона.
- аннотации делают ваш класс красивым.
плюсы:
- это хорошо работает для простых классов. Создание сложного класса parcelable может быть сложным.
- Ломбок и AspectJ не играют хорошо вместе. [детали]
- посмотреть мои предупреждения.
Hrisey
предупреждение!
Hrisey имеет известную проблему с Java 8 и поэтому не может быть использован для разработки Android в настоящее время. Смотрите #1 не удается найти ошибки символов (JDK 8).
Hrisey основан на Ломбок. Parcelable класс с помощью Hrisey:
@hrisey.Parcelable public final class POJOClass implements android.os.Parcelable { /* Fields, accessors, default constructor */ }теперь вам не нужно реализовывать все методы интерфейса Parcelable. Hrisey будет генерировать весь необходимый код на этапе предварительной обработки.
Hrisey в Gradle зависимости:
provided "pl.mg6.hrisey:hrisey:${hrisey.version}"посмотреть здесь для поддерживаемых типов. Элемент
ArrayListсреди них.установите плагин-Hrisey xor Lombok* - для вашей IDE и начните использовать его удивительные возможности!
* Не включайте Плагины Hrisey и Lombok вместе, иначе вы получите ошибку при запуске IDE.
Parceler
Parcelable класс с помощью Parceler:
@java.org.parceler.Parcel public class POJOClass { /* Fields, accessors, default constructor */ }использовать сгенерированный код, вы можете использовать сгенерированный класс напрямую, или через
Parcelsслужебный класс с помощьюpublic static <T> Parcelable wrap(T input);разыменования
@Parcel, просто вызовите следующий методParcelsклассpublic static <T> T unwrap(Parcelable input);Parceler в зависимостях Gradle:
compile "org.parceler:parceler-api:${parceler.version}" provided "org.parceler:parceler:${parceler.version}"посмотреть в README для поддерживаемых типы.
AutoParcel
AutoParcel это AutoValue
это очень просто, вы можете использовать плагин на android studio, чтобы сделать объекты Parcelables.
public class Persona implements Parcelable { String nombre; int edad; Date fechaNacimiento; public Persona(String nombre, int edad, Date fechaNacimiento) { this.nombre = nombre; this.edad = edad; this.fechaNacimiento = fechaNacimiento; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.nombre); dest.writeInt(this.edad); dest.writeLong(fechaNacimiento != null ? fechaNacimiento.getTime() : -1); } protected Persona(Parcel in) { this.nombre = in.readString(); this.edad = in.readInt(); long tmpFechaNacimiento = in.readLong(); this.fechaNacimiento = tmpFechaNacimiento == -1 ? null : new Date(tmpFechaNacimiento); } public static final Parcelable.Creator<Persona> CREATOR = new Parcelable.Creator<Persona>() { public Persona createFromParcel(Parcel source) { return new Persona(source); } public Persona[] newArray(int size) { return new Persona[size]; } };}
Теперь вы можете использовать Parceler библиотека для преобразования любого пользовательского класса в parcelable. Просто аннотируйте свой класс POJO с помощью @ Parcel. например,
@Parcel public class Example { String name; int id; public Example() {} public Example(int id, String name) { this.id = id; this.name = name; } public String getName() { return name; } public int getId() { return id; } }вы можете создать объект класса Example и обернуть через посылки и отправить как пакет через intent. е.г
Bundle bundle = new Bundle(); bundle.putParcelable("example", Parcels.wrap(example));Теперь, чтобы получить пользовательский объект класса просто используйте
Example example = Parcels.unwrap(getIntent().getParcelableExtra("example"));
поставить:
bundle.putSerializable("key",(Serializable) object);получить:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));






Comments