बंडल में Android HashMap?


90

इसके साथ भेजने का android.os.Messageउपयोग करता है BundleSendMessage-Method। इसलिए, क्या HashMapअंदर डालना संभव है Bundle?


जावा और एंड्रॉयड नौसिखिया 8) सभी के लिए!
मार्कस टोपर

किसी भी उत्तर को स्वीकार करें यदि हमने आपकी समस्या का समाधान किया है। thx
AMerle


जवाबों:


164

इस प्रकार प्रयास करें:

Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);

और दूसरी गतिविधि में

Bundle bundle = this.getIntent().getExtras();

if(bundle != null) {
   hashMap = bundle.getSerializable("HashMap");
}

क्योंकि हाशम डिफ़ॉल्ट रूप से लागू होता है, Serializableइसलिए आप इसे putSerializableबंडल में उपयोग करके पास कर सकते हैं और अन्य गतिविधि में उपयोग कर सकते हैंgetSerializable


लिंक किए गए हैश मैप पार्सल को सीरियस करने की कोशिश करते समय मुझे त्रुटि हो रही है: पार्सल: marshal value com पर असमर्थ। HelID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher

1
क्या मैं इस पद्धति का उपयोग उस वस्तु के लिए कर सकता हूं जिसमें आदिम डेटा प्रकार और किसी अन्य ऑब्जेक्ट की सरणी सूची है ??
स्वीटविशर

3
यदि आपको समस्या हो रही है तो सुनिश्चित करें कि आप HashMap नहीं मानचित्र का उपयोग कर रहे हैं
मैथ्यू

1
आप निम्न तरीकों से
हैशमैप के लिए दिए गए अनुक्रमिक

3
यह अनियंत्रित कलाकारों के बारे में एक चेतावनी पैदा करता है। क्या यह अनदेखी करना सुरक्षित है?
mitsest

12

डॉक्टर के अनुसार , Hashmapलागू होता है Serializable, तो आप putSerializableअनुमान लगा सकते हैं। क्या तुमने कोशिश की ?


6

कृपया ध्यान दें: यदि आप एक AppCompatActivity का उपयोग कर रहे हैं, तो आपको protected void onSaveInstanceState(Bundle outState) {}( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} ) विधि को कॉल करना होगा ।

उदाहरण कोड ...

मानचित्र संग्रहीत करें:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("leftMaxima", leftMaxima);
    outState.putSerializable("rightMaxima", rightMaxima);
}

और इसे onCreate में प्राप्त करें:

if (savedInstanceState != null) {
    leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
    rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}

क्षमा करें यदि यह किसी प्रकार का डुप्लिकेट उत्तर है - तो शायद किसी को यह उपयोगी लगेगा। :)


4

यदि आप बंडल में सभी कुंजी भेजना चाहते हैं, तो आप कोशिश कर सकते हैं

for(String key: map.keySet()){
    bundle.putStringExtra(key, map.get(key));
}

मैं उत्सुक हूँ अगर ऐसा करने का कोई कारण नहीं है? मैंने सीरियलाइज़ेशन का बहुत उपयोग नहीं किया है, और कभी भी बंडलों (एंड्रॉइड के लिए नया) नहीं है, इसलिए मैं उत्सुक हूं कि क्या यह ओ (एन) है और एक बंडल में जोड़ना प्रभावी रूप से ओ (1) है या नहीं। यदि वे लागत में भिन्न नहीं हैं, तो यह नहीं देखना कि आप इसे किसी अन्य मानचित्र में क्रमबद्ध करने से क्यों परेशान होंगे।
कैप्टन प्रिंस

@CaptainPrinny जब तक कि मानचित्र एकमात्र ऐसी चीज़ नहीं है जिसे आप बंडल में मैप कर रहे हैं, तो आप मानों को बंद कर सकते हैं और आपको पता नहीं चलेगा कि क्या कुंजी मूल नक्शे का हिस्सा है या बंडल में संग्रहीत केवल एक मान है।
जेसन

1
  public static Bundle mapToBundle(Map<String, Object> data) throws Exception {
    Bundle bundle = new Bundle();
    for (Map.Entry<String, Object> entry : data.entrySet()) {
        if (entry.getValue() instanceof String)
            bundle.putString(entry.getKey(), (String) entry.getValue());
        else if (entry.getValue() instanceof Double) {
            bundle.putDouble(entry.getKey(), ((Double) entry.getValue()));
        } else if (entry.getValue() instanceof Integer) {
            bundle.putInt(entry.getKey(), (Integer) entry.getValue());
        } else if (entry.getValue() instanceof Float) {
            bundle.putFloat(entry.getKey(), ((Float) entry.getValue()));
        }
    }
    return bundle;
}

1

मैं पार्सल के अपने कोटलिन कार्यान्वयन का उपयोग कर रहा हूं ताकि इसे प्राप्त किया जा सके और अब तक यह मेरे लिए काम करता है। यह उपयोगी है अगर आप भारी सीरियल से बचना चाहते हैं।

इसके अलावा काम करने के लिए, मैं इसे इनका उपयोग करने की सलाह देता हूं

घोषणा

class ParcelableMap<K,V>(val map: MutableMap<K,V>) : Parcelable {
    constructor(parcel: Parcel) : this(parcel.readMap(LinkedHashMap<K,V>()))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeMap(map)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<ParcelableMap<Any?,Any?>> {
        @JvmStatic
        override fun createFromParcel(parcel: Parcel): ParcelableMap<Any?,Any?> {
            return ParcelableMap(parcel)
        }
        @JvmStatic 
        override fun newArray(size: Int): Array<ParcelableMap<Any?,Any?>?> {
            return arrayOfNulls(size)
        }
    }

}

उपयोग

लिखो

val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)

पढ़ना

val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map

यह मत भूलो कि यदि आपके नक्शे K,Vको डिफ़ॉल्ट रूप से पार्सल नहीं किया गया है तो उन्हें लागू करना होगाParcelable


1
क्या आपने @Parcelize से छोटा करने की कोशिश की?
कूलमाइंड

0

कोटलिन में:

hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass>

putSerializable(ARG_HASH_MAP, hashMap)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.