The android.os.Message
menggunakan Bundle
untuk mengirim dengan itu SendMessage-metode. Oleh karena itu, apakah mungkin untuk menempatkan HashMap
di dalam Bundle
?
The android.os.Message
menggunakan Bundle
untuk mengirim dengan itu SendMessage-metode. Oleh karena itu, apakah mungkin untuk menempatkan HashMap
di dalam Bundle
?
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 menggunakan putSerializable
Bundle dan masuk ke aktivitas lain menggunakangetSerializable
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. :)
Jika Anda ingin mengirim semua kunci dalam bundel, Anda dapat mencobanya
for(String key: map.keySet()){
bundle.putStringExtra(key, map.get(key));
}
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;
}
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