5

我正在尝试通过 Intent 对象将一组Address对象传递给另一个 Activity。

由于 Address 类实现Parcelable接口,我尝试执行以下操作。我从 Geocoder 对象中获得了 List Address 对象,我将其转换为 Address 对象数组。然后我把这个数组放入 Intent 并调用活动。

final Address[] addresses = addresseList.toArray(new Address[addresseList.size()]);

final Intent intent = new Intent(this, SelectAddress.class);
intent.putExtra(SelectAddress.INTENT_EXTRA_ADDRESSES, startAddresses);

startActivityForResult(intent, REQUEST_CODE_ACTIVITY_SELECT_ADDRESSES);

在另一个活动中,我尝试使用以下代码从 Intent 中检索 Address[]。但是最后一行的调用以 ClassCastException 结束Landroid.os.Parcelable

Bundle bundle = getIntent().getExtras();            
Address[] addresses = (Address[]) bundle.getParcelableArray(INTENT_EXTRA_ADDRESSES);

我究竟做错了什么?我如何必须检索地址 []。

4

3 回答 3

14

问题是铸造。尝试:

Bundle bundle = getIntent().getExtras();
Parcelable[] parcels = bundle.getParcelableArray(INTENT_EXTRA_ADDRESSES);

Address[] addresses = new Address[parcels.length];
for (Parcelable par : parcels){
     addresses.add((Address) par);              
}
于 2011-09-03T19:06:12.040 回答
5
或在 java1.6 上:
    Parcelable[] x = bundle.getParcelableArray(KEY);
    地址 = Arrays.copyOf(x, x.length, Address[].class);
于 2014-06-17T01:37:51.173 回答
1

@LiorZ答案是完全正确的。我只是将他的答案和另一个答案合并到这个方便的功能中。

@SuppressWarnings("unchecked")
private static <T extends Parcelable> T[] castParcelableArray(Class<T> clazz, Parcelable[] parcelableArray) {
    final int length = parcelableArray.length;
    final T[] array = (T[]) Array.newInstance(clazz, length);
    for (int i = 0; i < length; i++) {
        array[i] = (T) parcelableArray[i];
    }
    return array;
}
于 2014-02-13T10:49:40.743 回答