android.os.Message
Używa Bundle
do wysyłania z jego sendMessage sposobem. Dlatego czy można umieścić HashMap
wewnątrz Bundle
?
android
dictionary
bundle
Marcus Toepper
źródło
źródło
Odpowiedzi:
spróbuj jako:
Bundle extras = new Bundle(); extras.putSerializable("HashMap",hashMap); intent.putExtras(extras);
iw drugim ćwiczeniu
Bundle bundle = this.getIntent().getExtras(); if(bundle != null) { hashMap = bundle.getSerializable("HashMap"); }
ponieważ Hashmap domyślnie implementuje,
Serializable
więc możesz przekazać go używającputSerializable
w pakiecie i uzyskać w innej aktywności używającgetSerializable
źródło
Według doktora ,
Hashmap
narzędziaSerializable
, więcputSerializable
domyślam się. Próbowałeś tego?źródło
Uwaga: jeśli używasz AppCompatActivity, będziesz musiał wywołać metodę
protected void onSaveInstanceState(Bundle outState) {}
( NOTpublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}
).Przykładowy kod ...
Przechowuj mapę:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("leftMaxima", leftMaxima); outState.putSerializable("rightMaxima", rightMaxima); }
I otrzymaj to w onCreate:
if (savedInstanceState != null) { leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima"); rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima"); }
Przepraszam, jeśli to jakaś podwójna odpowiedź - może ktoś uzna ją za przydatną. :)
źródło
Jeśli chcesz wysłać wszystkie klucze w pakiecie, możesz spróbować
for(String key: map.keySet()){ bundle.putStringExtra(key, map.get(key)); }
źródło
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; }
źródło
Aby to osiągnąć, używam mojej implementacji kotlin Parcelable i jak dotąd działa dla mnie. Jest to przydatne, jeśli chcesz uniknąć ciężkich serializacji.
Aby to zadziałało, polecam używanie go z nimi
Deklaracja
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) } } }
Posługiwać się
pisać
val map = LinkedHashMap<Int, String>() val wrap = ParcelableMap<Int,String>(map) Bundle().putParcelable("your_key", wrap)
czytać
val bundle = fragment.arguments ?: Bundle() val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key") val map = wrap.map
Nie zapominaj, że jeśli twoja mapa
K,V
nie jest domyślnie spakowana, musi to zaimplementowaćParcelable
źródło
W Kotlinie:
hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass> putSerializable(ARG_HASH_MAP, hashMap)
źródło