Сделайте пользовательский объект Java Parcelable в Android - PullRequest
3 голосов
/ 26 сентября 2011

Я пытаюсь отправить объект типа MyCustomObject другому действию через намерение. Я знаю, чтобы сделать класс Parcelable, я должен сделать public class MyCustomObject implements Parcelable, но я не уверен, как массивы пользовательских объектов работают в parcelable. Вот что я получил до сих пор ... Кроме того, мне нужно, чтобы класс Search также реализовывал Parcelable?

Вот мой обновленный ответ Теперь я получаю нулевой объект, когда делаю intent.getParcelableExtra(search). Может быть, я неправильно создаю поисковый массив?

public class MyCustomObject implements Parcelable{
    public Search search[];

    public MyCustomObject(Parcel in){
        in.readArray(MyCustomObject.class.getClassLoader());
    }

    @Override
    public int describeContents(){
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags){
        dest.writeArray(search)
    }

    public static final Parcelable.Creator<MyCustomObject> CREATOR = new Parcelable.Creator<MyCustomObject>(){
        @Override
        public MyCustomObject createFromParcel(Parcel source){
            return new MyCustomObject(source);
        }

        @Override
        public MyCustomObject[] newArray(int size){
            return new MyCustomObject[size];
        }
    }

    public static class Search implements Parcelable{
        public int rank;
        public String title;
        public String[] imageURL;

        public Search(Parcel in){
            rank = in.readInt();
            title = in.readString();

            String[] url = new String[4];
            in.readStringArray(url);
            url = imageURL
        }

        @Override
        public int describeContents(){
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags){
            dest.writeInt(rank);
            dest.writeString(title);
            dest.writeStringArray(imageURL);
        }

        public static final Parcelable.Creator<Search> CREATOR = new Parcelable.Creator<Search>(){

        @Override
        public Search createFromParcel(Parcel source){
            return new Search(source);
        }

        @Override
        public Search[] newArray(int size){
            return new Search[size];
        }
    }

    }
}

Ответы [ 2 ]

7 голосов
/ 26 сентября 2011

Пара вещей. Во-первых, ваш поисковый объект должен будет также реализовать Parcelable. Затем вам нужно создать статическое поле с именем CREATOR, которое реализует Parcelable.Creator . Это будет иметь метод с именем createFromParcel, который возвращает экземпляр MyCustomObject. Здесь вы читаете данные из посылки и создаете новый экземпляр MyCustomObject. По сути, это противоположность writeToParcel. Это все относится и к поиску, так как вы должны заставить его реализовать Parcelable. В итоге:

  • Сделать поиск реализовать Parcelable
  • Реализация Search.writeToParcel
  • Создать статическое поле в Поиске с именем CREATOR, которое реализует Parcelable.Creator
  • Реализация метода createFromParcel для Search.CREATOR
  • Создать статическое поле в MyCustomObject с именем CREATOR, которое реализует Parcelable.Creator
  • Реализация метода createFromParcel MyCustomObject.CREATOR
1 голос
/ 20 октября 2012

когда вы читаете Array из Parcel, вы хотите прочитать массив Search []. Не MyCustomObject.

    public MyCustomObject(Parcel in){
       in.readArray(MyCustomObject.class.getClassLoader());
    }
...