android.os.Message
Bir kullanır Bundle
's sendMessage-yöntemi ile göndermek. Bu nedenle, HashMap
içine a koymak mümkün müdür Bundle
?
android.os.Message
Bir kullanır Bundle
's sendMessage-yöntemi ile göndermek. Bu nedenle, HashMap
içine a koymak mümkün müdür Bundle
?
Yanıtlar:
olarak deneyin:
Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);
ve ikinci Faaliyette
Bundle bundle = this.getIntent().getExtras();
if(bundle != null) {
hashMap = bundle.getSerializable("HashMap");
}
Çünkü HashMap varsayılan implementlerin Serializable
Eğer kullanarak geçmek böylece putSerializable
Bundle ve kullanan diğer aktivitede olsungetSerializable
Lütfen dikkat: Bir AppCompatActivity kullanıyorsanız, protected void onSaveInstanceState(Bundle outState) {}
( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}
) yöntemini çağırmanız gerekecektir
.
Örnek kod ...
Haritayı saklayın:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("leftMaxima", leftMaxima);
outState.putSerializable("rightMaxima", rightMaxima);
}
Ve onCreate içinde alın:
if (savedInstanceState != null) {
leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}
Özür dilerim, eğer bir tür yinelenen cevapsa - belki birisi bunu faydalı bulacaktır. :)
Paketteki tüm anahtarları göndermek istiyorsanız, deneyebilirsiniz.
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;
}
Bunu başarmak için kotlin Parcelable uygulamamı kullanıyorum ve şu ana kadar benim için çalışıyor. Yoğun serileştirilebilirlikten kaçınmak istiyorsanız kullanışlıdır.
Ayrıca çalışmak için sırayla, ben bunu kullanmanızı öneririz bu
Beyanname
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)
}
}
}
Kullanım
yazmak
val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)
okumak
val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map
Haritanız K,V
varsayılan olarak parsellenmemişse,Parcelable