Android HashMap dalam Bundle?

91

The android.os.Messagemenggunakan Bundleuntuk mengirim dengan itu SendMessage-metode. Oleh karena itu, apakah mungkin untuk menempatkan HashMapdi dalam Bundle?

Marcus Toepper
sumber
java DAN android newbie 8) terima kasih untuk semua!
Marcus Toepper
Terima jawaban apa pun jika kami menyelesaikan masalah Anda. thx
AMerle

Jawaban:

165

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 Serializablesehingga Anda bisa meneruskannya menggunakan putSerializableBundle dan masuk ke aktivitas lain menggunakangetSerializable

ρяσѕρєя K
sumber
Saya mendapatkan kesalahan saat mencoba membuat serialisasi peta hash yang ditautkan Parcel: tidak dapat menyusun nilai com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ
1
Dapatkah saya menggunakan metode ini untuk objek yang berisi tipe data primitif dan daftar larik objek lain ??
SweetWisher ツ
3
Jika Anda mengalami masalah, pastikan Anda menggunakan HashMap bukan Peta
Matius
1
Anda mungkin ingin mentransmisikan objek yang dapat diserialkan yang dikembalikan ke hashmap dengan cara berikut (HashMap <String, Integer>)
cammando
3
Ini menghasilkan peringatan tentang pemeran yang tidak dicentang. Apakah ini aman untuk diabaikan?
mitsest
12

Menurut dok , Hashmapimplementasinya Serializable, jadi Anda bisa putSerializablemenebaknya. Apakah kamu sudah mencobanya ?

AMerle
sumber
6

Harap diperhatikan: Jika Anda menggunakan AppCompatActivity, Anda harus memanggil metode protected void onSaveInstanceState(Bundle outState) {}( BUKAN public 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. :)

Martin Pfeffer
sumber
4

Jika Anda ingin mengirim semua kunci dalam bundel, Anda dapat mencobanya

for(String key: map.keySet()){
    bundle.putStringExtra(key, map.get(key));
}
Kapil Vats
sumber
Saya ingin tahu apakah ada alasan untuk tidak melakukan ini? Saya belum banyak menggunakan serialisasi, dan tidak pernah bundel (baru mengenal android), jadi saya penasaran apakah ini O (n) dan menambahkan bundel secara efektif O (1) atau tidak. Jika harganya tidak berbeda, tidak melihat mengapa Anda repot-repot menserialisasinya ke peta lain.
Kapten Prinny
@CaptainPrinny kecuali peta adalah satu-satunya hal yang Anda petakan ke bundel, Anda mungkin akan memanjat nilai dan Anda tidak akan tahu apakah kunci adalah bagian dari peta asli atau hanya nilai yang disimpan dalam bundel.
Jason
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;
}
Jasss
sumber
1

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,Vtidak dipaketkan secara default, mereka harus diimplementasikanParcelable

Jocky Doe
sumber
1
Apakah Anda mencoba mempersingkat dengan @Parcelize?
CoolMind
0

Di Kotlin:

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

putSerializable(ARG_HASH_MAP, hashMap)
CoolMind
sumber