如何将Address对象数组传递给另一个Activity

时间:2010-09-05 19:28:18

标签: android android-activity android-intent parcelable

我正在尝试通过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);

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

3 个答案:

答案 0 :(得分: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);              
}

答案 1 :(得分:5)

or on java1.6:
    Parcelable[] x = bundle.getParcelableArray(KEY);
    addresses = Arrays.copyOf(x, x.length, Address[].class);

答案 2 :(得分:0)

@LiorZ answer完全正确。我刚刚在这个方便的函数中合并了他的答案和this other

@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;
}