2010-09-05 8 views
5

पर पता ऑब्जेक्ट्स की सरणी को कैसे पास किया जाए, मैं एक इरादा ऑब्जेक्ट के माध्यम से Address ऑब्जेक्ट्स की किसी अन्य गतिविधि को पास करने का प्रयास कर रहा हूं।किसी अन्य Acitvity

जैसा कि पता वर्ग Parcelable इंटरफ़ेस लागू करता है, मैं निम्न कार्य करने का प्रयास करता हूं। मुझे एक जियोकोडर ऑब्जेक्ट से एक सूची पता ऑब्जेक्ट मिला, जिसे मैं पता ऑब्जेक्ट्स की सरणी में परिवर्तित करता हूं। फिर मैंने इस सरणी को इरादे में रखा और गतिविधि को बुलाया।

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

दूसरी गतिविधि पर मैं कोड के निम्नलिखित भाग के साथ इरादे से पता [] पुनर्प्राप्त करने का प्रयास करता हूं। लेकिन अंतिम पंक्ति का कॉल क्लासकास्टएक्सप्शन Landroid.os.Parcelable के साथ समाप्त होता है।

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

मैं क्या गलत कर रहा हूं? मुझे पता कैसे प्राप्त करना है []।

+0

"हाय मैं एक आशय वस्तु के माध्यम से एक और गतिविधि को पता ऑब्जेक्ट की श्रृंखला पारित करने के लिए कोशिश कर रहा हूँ।" -- क्यूं कर? मेरे लिए, गतिविधियों के बीच जटिल वस्तुओं को गुजरना एक कोड गंध है। यूआरएल पर पैरामीटर प्राप्त करने के रूप में 'इरादा' अतिरिक्त के बारे में सोचें। यदि ये दो वेब पेज थे, तो क्या आप एक लिंक में यूआरएल पर जीईटी पैरामीटर के रूप में 'पता' ऑब्जेक्ट्स का गुच्छा पारित करेंगे? यह मानते हुए कि 'पता' ऑब्जेक्ट्स की सरणी गुजरना अपरिहार्य है, आप जिस वस्तु का सामना कर रहे हैं उसका प्रकार क्या है? 'क्लासकास्ट एक्सेप्शन' लाइन आपको यह बताना चाहिए। – CommonsWare

+0

क्लासकास्टएक्सप्शन द्वारा उल्लिखित प्रकार एक Landroid.os.Parcelable है। – Flo

+0

आप किसी गतिविधि के लिए जटिल वस्तुओं की एक सरणी पारित करने के बारे में चिंताओं के बारे में चिंतित हैं। मैं जो करना चाहता हूं वह उपयोगकर्ता को दूसरी गतिविधि प्रदान कर रहा है जहां वह पते की सूची से चयन कर सकता है, जब पहली गतिविधि में किसी पते की खोज ने कई परिणामों को वापस कर दिया है। स्पिनर में उन्हें प्रदर्शित करने के लिए दूसरी गतिविधि में पते को पारित किए बिना आप इसे कैसे कार्यान्वित करेंगे, ताकि उपयोगकर्ता उनमें से एक का चयन कर सके? – Flo

उत्तर

13

समस्या कास्टिंग है। प्रयास करें:

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

जवाब सही है , लेकिन जब से आप किसी सरणी में जोड़ने के लिए ".add" का उपयोग कर सकते थे? lol इसका उपयोग करें: ** 'के लिए (int i = 0; i Shehaaz

0

@LiorZanswer पूरी तरह से सच है। मैंने इस आसान कार्य में बस अपना जवाब और 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; 
} 
4
 
or on java1.6: 
    Parcelable[] x = bundle.getParcelableArray(KEY); 
    addresses = Arrays.copyOf(x, x.length, Address[].class); 
+3

स्टैक ओवरव्लो में आपका स्वागत है! भले ही आपने कोई उत्तर दिया हो, फिर भी आपके समाधान के मुकाबले कुछ और स्पष्ट करना सबसे अच्छा है, और यह ओपी को उनके प्रश्न के साथ कैसे मदद करता है। –

+0

यह आपको लूप लिखने की आवश्यकता नहीं है जिस तरह से मदद करता है। इसके बजाय एक लाइन। – Malachiasz

संबंधित मुद्दे