Как я могу сделать мои пользовательские объекты Parcelable?



Я пытаюсь сделать мои объекты Parcelable. Однако у меня есть пользовательские объекты, и эти объекты имеют ArrayList атрибуты других пользовательских объектов, которые я сделал.



что было бы лучшим способом сделать это?

640   9  

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

в этом примере показаны только строковые типы. Но, вы можете посылать любые данные, которые вы хотите. Попробовать ее.

редактировать: еще один пример, предложил Рукмал Диас.

вот веб-сайт для создания Parcelable класса из созданного класса:

http://www.parcelabler.com/

IntelliJ IDEA и Android Studio есть плагины для этого:

эти плагины генерируют Android Parcelable boilerplate кода на основе полей в классе.

Plugin demo

1. Импорт Android Parcelable code generator

enter image description here

2. Создайте класс

public class Sample {
    int id;
    String name;
}

3. Создать > Parcelable из меню

enter image description here enter image description here

сделано.

как? С аннотациями.

вы просто аннотировать 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 и начните использовать его удивительные возможности!

enter image description here
* Не включайте Плагины 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

Я нашел самый простой способ создать Parcelable class

enter image description here

это очень просто, вы можете использовать плагин на 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

    Ничего не найдено.