Sử android.os.Message
dụng a Bundle
để gửi với phương thức sendMessage của nó. Do đó, có thể đặt HashMap
bên trong a Bundle
?
Sử android.os.Message
dụng a Bundle
để gửi với phương thức sendMessage của nó. Do đó, có thể đặt HashMap
bên trong a Bundle
?
Câu trả lời:
cố gắng như:
Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);
và trong Hoạt động thứ hai
Bundle bundle = this.getIntent().getExtras();
if(bundle != null) {
hashMap = bundle.getSerializable("HashMap");
}
bởi vì Hashmap theo mặc định triển khai Serializable
nên bạn có thể chuyển nó bằng cách sử dụng putSerializable
trong Gói và tham gia vào hoạt động khác bằng cách sử dụnggetSerializable
Xin lưu ý: Nếu bạn đang sử dụng AppCompatActivity, bạn sẽ phải gọi
phương thức protected void onSaveInstanceState(Bundle outState) {}
( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}
).
Mã ví dụ ...
Lưu trữ bản đồ:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("leftMaxima", leftMaxima);
outState.putSerializable("rightMaxima", rightMaxima);
}
Và nhận nó trong onCreate:
if (savedInstanceState != null) {
leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}
Xin lỗi nếu đó là một số loại câu trả lời trùng lặp - có thể ai đó sẽ thấy nó hữu ích. :)
Nếu bạn muốn gửi tất cả các khóa trong gói, bạn có thể thử
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;
}
Tôi đang sử dụng kotlin triển khai Parcelable của mình để đạt được điều đó và cho đến nay nó phù hợp với tôi. Nó rất hữu ích nếu bạn muốn tránh quá nhiều tuần tự hóa.
Ngoài ra, để nó hoạt động, tôi khuyên bạn nên sử dụng nó với những
Tờ khai
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)
}
}
}
Sử dụng
viết
val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)
đọc
val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map
Đừng quên rằng nếu bản đồ của bạn K,V
không được phân chia theo mặc định thì chúng phải thực hiệnParcelable