Le android.os.Message
utilise a Bundle
pour envoyer avec sa méthode sendMessage. Par conséquent, est-il possible de mettre un à l' HashMap
intérieur d'un Bundle
?
Le android.os.Message
utilise a Bundle
pour envoyer avec sa méthode sendMessage. Par conséquent, est-il possible de mettre un à l' HashMap
intérieur d'un Bundle
?
Réponses:
essayez comme:
Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);
et en deuxième activité
Bundle bundle = this.getIntent().getExtras();
if(bundle != null) {
hashMap = bundle.getSerializable("HashMap");
}
parce que Hashmap implémente par défaut Serializable
afin que vous puissiez le transmettre en utilisant putSerializable
dans Bundle et entrer dans une autre activité en utilisantgetSerializable
Remarque: si vous utilisez une AppCompatActivity, vous devrez appeler la
méthode protected void onSaveInstanceState(Bundle outState) {}
( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}
).
Exemple de code ...
Stockez la carte:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("leftMaxima", leftMaxima);
outState.putSerializable("rightMaxima", rightMaxima);
}
Et recevez-le dans onCreate:
if (savedInstanceState != null) {
leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}
Désolé si c'est une sorte de réponse en double - peut-être que quelqu'un la trouvera utile. :)
Si vous souhaitez envoyer toutes les clés du bundle, vous pouvez essayer
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;
}
J'utilise mon implémentation kotlin de Parcelable pour y parvenir et jusqu'à présent, cela fonctionne pour moi. C'est utile si vous voulez éviter le sérialisable lourd.
Aussi pour que cela fonctionne, je recommande de l'utiliser avec ces
Déclaration
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)
}
}
}
Utilisation
écrire
val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)
lis
val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map
N'oubliez pas que si votre carte K,V
n'est pas parcellisée par défaut, elle doit implémenterParcelable