The android.os.Message
menggunakan Bundle
untuk mengirim dengan itu SendMessage-metode. Oleh karena itu, apakah mungkin untuk menempatkan HashMap
di dalam Bundle
?
android
dictionary
bundle
Marcus Toepper
sumber
sumber
Jawaban:
coba sebagai:
Bundle extras = new Bundle(); extras.putSerializable("HashMap",hashMap); intent.putExtras(extras);
dan dalam Aktivitas kedua
Bundle bundle = this.getIntent().getExtras(); if(bundle != null) { hashMap = bundle.getSerializable("HashMap"); }
karena Hashmap secara default mengimplementasikan
Serializable
sehingga Anda bisa meneruskannya menggunakanputSerializable
Bundle dan masuk ke aktivitas lain menggunakangetSerializable
sumber
Menurut dok ,
Hashmap
implementasinyaSerializable
, jadi Anda bisaputSerializable
menebaknya. Apakah kamu sudah mencobanya ?sumber
Harap diperhatikan: Jika Anda menggunakan AppCompatActivity, Anda harus memanggil metode
protected void onSaveInstanceState(Bundle outState) {}
( BUKANpublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}
).Kode contoh ...
Simpan peta:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("leftMaxima", leftMaxima); outState.putSerializable("rightMaxima", rightMaxima); }
Dan terima di onCreate:
if (savedInstanceState != null) { leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima"); rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima"); }
Maaf jika itu semacam jawaban duplikat - mungkin seseorang akan menganggapnya berguna. :)
sumber
Jika Anda ingin mengirim semua kunci dalam bundel, Anda dapat mencobanya
for(String key: map.keySet()){ bundle.putStringExtra(key, map.get(key)); }
sumber
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; }
sumber
Saya menggunakan implementasi kotlin dari Parcelable untuk mencapai itu dan sejauh ini berhasil untuk saya. Ini berguna jika Anda ingin menghindari serializable yang berat.
Juga agar berfungsi, saya sarankan menggunakannya dengan ini
Pernyataan
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) } } }
Menggunakan
menulis
val map = LinkedHashMap<Int, String>() val wrap = ParcelableMap<Int,String>(map) Bundle().putParcelable("your_key", wrap)
Baca
val bundle = fragment.arguments ?: Bundle() val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key") val map = wrap.map
Jangan lupa bahwa jika peta Anda
K,V
tidak dipaketkan secara default, mereka harus diimplementasikanParcelable
sumber
Di Kotlin:
hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass> putSerializable(ARG_HASH_MAP, hashMap)
sumber