如何在Android中重用Parcelable对象?

时间:2012-01-03 09:52:22

标签: android hashmap parcelable android-activity

我有实现Parcelable接口的类。它包含HashMap,此HashMap包含位图图像。我的所有活动都需要HashMap。所以我使用了Parcelable。查看我的Parcelable代码。

private HashMap<String, Bitmap> map;

        public ParcelFullData() {
            map = new HashMap();
        }

        public ParcelFullData(Parcel in) {
            map = new HashMap();
            readFromParcel(in);
        }

        public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
            public ParcelFullData createFromParcel(Parcel in) {
                return new ParcelFullData(in);
            }

            public ParcelFullData[] newArray(int size) {
                return new ParcelFullData[size];
            }
        };

        public int describeContents() {
            return 0;
        }

        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(map.size());
            for (String s: map.keySet()) {
                dest.writeString(s);
                dest.writeValue(map.get(s));
            }
        }

        public void readFromParcel(Parcel in) {
            int count = in.readInt();
            for (int i = 0; i < count; i++) {
                map.put(in.readString(), (Bitmap)in.readValue(Bitmap.class.getClassLoader()));
            }
        }

        public Bitmap get(String key) {
            return map.get(key);
        }

        public String[] getKeys() {
            Set<String> mapset = map.keySet();
            String[] photoName = new String[mapset.size()];
            Iterator<String> itr = mapset.iterator();
            int index = 0;
            while (itr.hasNext()) {
                String name = itr.next();
                photoName[index] = name;
                index++;
            }
            return photoName;
        }

        public void put(String key, Bitmap value) {
            map.put(key, value);
        }

        public HashMap<String, Bitmap> getHashMap() {
            return map;
        }

当我将Activity传递给另一个Activity时,这将正常工作。(例如Activity AActivity B。)但是如果我将此传递给另一个Activity(例如Activity BActivity C。)表示HashMap不包含任何元素。那个大小是0.

在Activity_A中,

Intent setIntent = new Intent(activity_a, Activity_B.class);

ParcelFullData parcelData = new ParcelFullData();

Bundle b = new Bundle();
b.putParcelable("parcelData", parcelData);
startActivity(setIntent);

在Activity_B中

ParcelFullData parcelData = (ParcelFullData)bundle.getParcelable("parcelData");

Parcel parcel = Parcel.obtain();
parcel.writeParcelable(parcelData , 0);
parcelData.writeToParcel(parcel, 0);
Intent setIntent = new Intent(activity_a, Activity_B.class);
Bundle b = new Bundle();
b.putParcelable("parcelData", parcelData);
startActivity(setIntent);

我在Activity C中也这样做。

如何使用解决此问题?

1 个答案:

答案 0 :(得分:1)

为什么使用bundle?您不要将此捆绑包添加到intent。使用Intent.putExtra(String, Parcelable),一切都会好的。我通过我的应用程序中的所有活动传递了一个Parcelable对象,它运行正常。

在第一项活动中:

Intent i = new Intent(activity_a, Activity_B.class);
i.putExtra("parcelData", parcelData);

在第二项活动中:

parcelData = getIntent().getParcelableExtra("parcelData");
// ... do anything with parcelData here
Intent i = new Intent(activity_b, Activity_C.class);
i.putExtra("parcelData", parcelData);