android.os.Message
использует Bundle
для отправки с помощью метода sendMessage. Поэтому можно ли положить a HashMap
внутри a Bundle
?
Android HashMap в Bundle?
Ответ 1
попробуйте как:
Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);
и во втором действии
Bundle bundle = this.getIntent().getExtras();
if(bundle != null) {
hashMap = bundle.getSerializable("HashMap");
}
потому что Hashmap по умолчанию реализует Serializable
, поэтому вы можете передать его с помощью putSerializable
в Bundle и получить другую активность, используя getSerializable
Ответ 2
В соответствии с doc, Hashmap
реализует Serializable
, поэтому вы можете putSerializable
, я думаю. Вы попробовали?
Ответ 3
Обратите внимание: если вы используете AppCompatActivity, вам нужно будет позвонить
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);
}
И получите его в onCreate:
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));
}
Ответ 5
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;
}
Ответ 6
Для этого я использую свою реализацию Parcelable в kotlin, и пока она работает для меня. Это полезно, если вы хотите избежать сериализации.
Кроме того, чтобы он работал, я рекомендую использовать его с этими
Декларация
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
Ответ 7
В Котлине:
hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass>
putSerializable(ARG_HASH_MAP, hashMap)