2016-05-26 5 views
23

क्या स्पष्ट पुनरावृत्ति के बिना एंड्रॉइड में मानचित्र को बंडल में कनवर्ट करने का कोई आसान तरीका है?एंड्रॉइड में मानचित्र को बंडल में कनवर्ट करें

क्यों?

फायरबेसेज अधिसूचना getData() के लिए एक मानचित्र देता है। मुझे डेटा को एक इरादे से पास करने की आवश्यकता है। पूर्व में जीसीएम ने मुझे एक बंडल दिया, इसलिए मुझे इसके बारे में चिंता करने की आवश्यकता नहीं थी।

+3

"क्या स्पष्ट मानचित्र के बिना एंड्रॉइड में एक मानचित्र को एक बंडल में परिवर्तित करने का कोई आसान तरीका है?" - ध्यान दें कि एक 'मानचित्र' जरूरी नहीं है कि वह 'बंडल' के बराबर हो। एक 'मानचित्र' में कुंजी हो सकती है जो तार नहीं हैं। एक 'मानचित्र' में ऐसे मान हो सकते हैं जो समर्थित डेटा प्रकारों में से एक न हों। – CommonsWare

+1

हां, लेकिन मेरे मामले में वे सभी प्राइमेटिव हैं और स्ट्रिंग –

+0

आप इसे क्रमबद्ध कर सकते हैं। – cyroxis

उत्तर

26

मैं एक अच्छा पुराने जमाने पाश के लिए है सबसे आसान तरीका लगता है:

Bundle bundle = new Bundle(); 
    for (Map.Entry<String, String> entry : getData().entrySet()) { 
     bundle.putString(entry.getKey(), entry.getValue()); 
    } 
+0

में भेज सकते हैं मेरे मामले में यह उतना अच्छा है जितना यह मिलता है, मुझे लगता है। –

+2

यह शायद एक अपवाद फेंक देगा क्योंकि पहले पैरामीटर "google_sent_time" में एक लंबा प्रकार है और आप 'putString' का उपयोग कर रहे हैं। आप अपने लिए प्रकार भिन्नता को संभालने के इरादे का बेहतर उपयोग करते हैं और 'intent.putExtra (entry.getKey(), entry.getValue()) का उपयोग करते हैं, इसलिए अलग-अलग डेटा प्रकार आपके लिए समस्या नहीं बनाते हैं। –

-2
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList) 
+0

कृपया अपना उत्तर अपडेट करें और समझाएं। –

1

आप writeToParcel(Parcel out, int flags) उपयोग करते हैं, एक Parcel कि इसी तरह उपयोगी हो सकता है उत्पन्न करने के लिए है, क्योंकि यह Bundle की एक माता पिता के वर्ग है सकते हैं, और यह RemoteMessage वर्ग के हिस्से के रूप में फायरबेस फ्रेमवर्क में आसानी से बनाया गया है। दस्तावेज़ीकरण here है।

+0

'पार्सल '' बंडल' का एक सुपरक्लास है, इसलिए यह समान रूप से उपयोगी हो सकता है, लेकिन इन्हें एक दूसरे के लिए उपयोग नहीं किया जा सकता है। –

+0

हां, मैंने उल्लेख किया कि यह इसके मूल वर्ग है। – SQLiteNoob

4

फ़ायरबेस मैसेजिंग के साथ इस मुद्दे पर आया और इसके लिए कोटलिन एक्सटेंशन फ़ंक्शन बनाया। gist is here, नीचे कोड। हालांकि मैं इस पद्धति का उपयोग कर रहा हूँ वहाँ कुछ चेतावनियां हैं:

  • यह प्रकार है कि एक बंडल में रखा जा सकता है के सभी को कवर नहीं करता
  • यह विकास के अंतर्गत अभी भी है और पूरी तरह से
  • परीक्षण नहीं किया गया

इस बात को ध्यान में रखते हुए, कृपया इसे एक गाइड के रूप में उपयोग करें जो एक निश्चित समाधान नहीं है। जब मैं विकसित होता हूं तो मैं गस्ट को अद्यतित रखूंगा।

import android.os.Bundle 
import android.os.IBinder 
import android.os.Parcelable 
import java.io.Serializable 

fun <V> Map<String, V>.toBundle(bundle: Bundle = Bundle()): Bundle = bundle.apply { 
    forEach { 
    val k = it.key 
    val v = it.value 
    when (v) { 
     is IBinder -> putBinder(k, v) 
     is Bundle -> putBundle(k, v) 
     is Byte -> putByte(k, v) 
     is ByteArray -> putByteArray(k, v) 
     is Char -> putChar(k, v) 
     is CharArray -> putCharArray(k, v) 
     is CharSequence -> putCharSequence(k, v) 
     is Float -> putFloat(k, v) 
     is FloatArray -> putFloatArray(k, v) 
     is Parcelable -> putParcelable(k, v) 
     is Serializable -> putSerializable(k, v) 
     is Short -> putShort(k, v) 
     is ShortArray -> putShortArray(k, v) 

//  is Size -> putSize(k, v) //api 21 
//  is SizeF -> putSizeF(k, v) //api 21 

     else -> throw IllegalArgumentException("$v is of a type that is not currently supported") 
//  is Array<*> -> TODO() 
//  is List<*> -> TODO() 
    } 
    } 
} 
+0

आज पहले कोटलिन के बारे में कभी नहीं सुना; दिलचस्प खोज – CCJ

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