বন্ডলে অ্যান্ড্রয়েড হ্যাশম্যাপ?


91

android.os.Messageএকটি ব্যবহার Bundleএটা sendMessage-পদ্ধতি সঙ্গে পাঠান। সুতরাং, এটি কি একটি HashMapভিতরে রাখা সম্ভব Bundle?


জাভা এবং অ্যান্ড্রয়েড নবাগত 8) সবাইকে থানেক্স!
মার্কাস টোপার

যদি আমরা আপনার সমস্যার সমাধান করি তবে কোনও উত্তর গ্রহণ করুন। thx
এমেরেল


উত্তর:


165

হিসাবে চেষ্টা করুন:

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


লিঙ্কযুক্ত হ্যাশ ম্যাপ পার্সেলকে সিরিয়াল করার চেষ্টা করার সময় আমি ত্রুটি পাচ্ছি: com মার্চাল মান com.SGID.DataClass.In
अवैध

4
আমি কি এই পদ্ধতির ব্যবহার করতে পারি যার মধ্যে আদিম ডেটা টাইপ এবং অন্য কোনও বস্তুর অ্যারে তালিকা রয়েছে ??
সুইটওয়িশার ツ

4
আপনার যদি সমস্যা হয় তবে নিশ্চিত হন যে আপনি হ্যাশম্যাপটি মানচিত্র নয়
ম্যাথু

4
আপনি নিম্নলিখিত উপায়ে হ্যাশম্যাপে ফেরত সিরিয়ালাইজযোগ্য অবজেক্টটি কাস্ট করতে চাইতে পারেন (হ্যাশম্যাপ <স্ট্রিং, ইন্টিজার>)
ক্যামমান্ডো

4
এটি চেক না করা castালাই সম্পর্কে একটি সতর্কতা তৈরি করে। এটি কি উপেক্ষা করা নিরাপদ?
mitsest

12

ডক অনুসারে , Hashmapপ্রয়োগগুলি Serializable, যাতে আপনি putSerializableঅনুমান করতে পারেন । তুমি কি চেষ্টা করেছ?


6

দয়া করে নোট করুন: আপনি যদি অ্যাপকম্প্যাটঅ্যাক্টিভিটি ব্যবহার করে থাকেন তবে আপনাকে protected void onSaveInstanceState(Bundle outState) {}( না public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} ) পদ্ধতিতে কল করতে হবে ।

উদাহরণ কোড ...

মানচিত্র সংরক্ষণ করুন:

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

এবং এটি অনক্রিটে গ্রহণ করুন:

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) হয় বা না হয়। যদি সেগুলি দামের চেয়ে আলাদা না হয় তবে কেন আপনি এটি অন্য মানচিত্রে ক্রমিকায়িত করতে বিরক্ত করবেন তা না দেখে।
ক্যাপ্টেন প্রিনি

@ ক্যাপটেনপ্রিনি যদি না মানচিত্রটি আপনি বান্ডিলটিতে ম্যাপিং করে থাকেন তবে আপনি মানগুলি ক্লোবার করতে পারেন এবং কোনও কী কী মূল মানচিত্রের অংশ বা বান্ডলে সঞ্চিত কোনও মান ছিল তা আপনি জানতে পারবেন না।
জেসন

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


4
আপনি কি @ পার্সেলাইজ দিয়ে ছোট করার চেষ্টা করেছিলেন?
কুলমাইন্ড

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.