Das android.os.Message
verwendet a Bundle
, um mit seiner sendMessage-Methode zu senden. Ist es daher möglich, ein HashMap
Inside a zu setzen Bundle
?
Das android.os.Message
verwendet a Bundle
, um mit seiner sendMessage-Methode zu senden. Ist es daher möglich, ein HashMap
Inside a zu setzen Bundle
?
Antworten:
versuchen als:
Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);
und in der zweiten Aktivität
Bundle bundle = this.getIntent().getExtras();
if(bundle != null) {
hashMap = bundle.getSerializable("HashMap");
}
da Hashmap standardmäßig implementiert ist, Serializable
sodass Sie es mit putSerializable
in Bundle übergeben und mit anderen Aktivitäten ausführen könnengetSerializable
Bitte beachten Sie: Wenn Sie eine AppCompatActivity verwenden, müssen Sie die protected void onSaveInstanceState(Bundle outState) {}
( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}
) -Methode aufrufen
.
Beispielcode ...
Speichern Sie die Karte:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("leftMaxima", leftMaxima);
outState.putSerializable("rightMaxima", rightMaxima);
}
Und erhalten Sie es in onCreate:
if (savedInstanceState != null) {
leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}
Tut mir leid, wenn es sich um eine doppelte Antwort handelt - vielleicht findet es jemand nützlich. :) :)
Wenn Sie alle Schlüssel im Bundle senden möchten, können Sie es versuchen
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;
}
Ich benutze meine Kotlin-Implementierung von Parcelable, um dies zu erreichen, und bisher funktioniert es für mich. Es ist nützlich, wenn Sie die schwere Serialisierbarkeit vermeiden möchten.
Auch damit es funktioniert, empfehle ich, es mit diesen zu verwenden
Erklärung
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)
}
}
}
Verwenden
schreiben
val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)
lesen
val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map
Vergessen Sie nicht, dass Ihre Karte K,V
implementiert werden muss , wenn sie nicht standardmäßig parzelliert istParcelable