2010-09-05 47 views
5

Tôi đang cố gắng để vượt qua một mảng của Address đối tượng đến một hoạt động thông qua một đối tượng Intent.Làm thế nào để vượt qua một mảng của các đối tượng địa chỉ để một Acitvity khác

Khi lớp Địa chỉ triển khai giao diện Parcelable Tôi cố thực hiện các thao tác sau. Tôi nhận được một đối tượng List Address từ một đối tượng Geocoder, mà tôi chuyển đổi thành một mảng các đối tượng Address. Sau đó, tôi đặt mảng này vào Intent và gọi hoạt động.

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

Trên hoạt động khác, tôi cố gắng truy xuất Địa chỉ [] từ Intent với đoạn mã sau. Nhưng cuộc gọi của dòng cuối cùng kết thúc bằng một ClassCastException Landroid.os.Parcelable.

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

Tôi đang làm gì sai? Làm cách nào để truy xuất Địa chỉ [].

+0

"Hi Tôi đang cố gắng để vượt qua một loạt các đối tượng Địa chỉ để Hoạt động khác thông qua một đối tượng Intent." -- tại sao? Đối với tôi, việc truyền các đối tượng phức tạp giữa các hoạt động là một mùi mã. Hãy suy nghĩ về tính năng bổ sung 'Intent' như là các tham số GET trên một URL. Nếu đây là hai trang Web, bạn sẽ chuyển một loạt các đối tượng 'Address' như các tham số GET trên một URL trong một liên kết? Giả sử rằng việc truyền một mảng các đối tượng 'Address' là không thể tránh khỏi, thì kiểu đối tượng mà bạn đang quay trở lại là gì? Dòng 'ClassCastException' sẽ cho bạn biết điều đó. – CommonsWare

+0

Loại được đề cập bởi ClassCastException là một Landroid.os.Parcelable. – Flo

+0

Về bạn lo ngại về việc truyền một mảng các đối tượng phức tạp đến một hoạt động. Những gì tôi muốn làm là cung cấp cho người dùng một hoạt động thứ hai nơi anh ta có thể chọn từ danh sách địa chỉ, khi tìm kiếm địa chỉ trong hoạt động đầu tiên đã trả lại nhiều kết quả. Làm thế nào bạn sẽ thực hiện điều này mà không cần chuyển các địa chỉ đến hoạt động thứ hai để hiển thị chúng trong một spinner, do đó, người dùng có thể chọn một trong số họ? – Flo

Trả lời

13

Sự cố xảy ra khi truyền. thử:

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

Câu trả lời là chính xác , nhưng từ khi nào bạn có thể sử dụng ".add" để thêm vào một mảng? lol sử dụng điều này: ** 'cho (int i = 0; i Shehaaz

0

@LiorZanswer là hoàn toàn đúng. Tôi vừa kết hợp câu trả lời của mình và this other trong chức năng tiện dụng này.

@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; 
} 
4
 
or on java1.6: 
    Parcelable[] x = bundle.getParcelableArray(KEY); 
    addresses = Arrays.copyOf(x, x.length, Address[].class); 
+3

Chào mừng bạn đến với StackOverflow! Mặc dù bạn đã cung cấp câu trả lời, tốt nhất bạn nên làm rõ thêm một chút về những gì mà giải pháp của bạn cung cấp, và cách nó giúp OP với câu hỏi của họ. –

+0

Nó giúp theo cách bạn không cần phải viết một vòng lặp. Thay vào đó, một dòng. – Malachiasz

Các vấn đề liên quan