5

Addressオブジェクトの配列を Intent オブジェクトを介して別の Activityに渡そうとしています。

Address クラスはParcelableインターフェースを実装するので、次のことを試みます。Geocoder オブジェクトから List Address オブジェクトを取得し、これを Address オブジェクトの配列に変換しました。次に、この配列をインテントに入れ、アクティビティを呼び出します。

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

他のアクティビティでは、次のコードを使用してインテントから Address[] を取得しようとしています。しかし、最後の行の呼び出しは ClassCastException で終了しますLandroid.os.Parcelable

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

私は何を間違っていますか?Address[] を取得するにはどうすればよいですか。

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 に答える