在实现 Parcelable 的类中,它有一个 HashMap 成员。
Saw Parcelable 有
public final void readMap(Map outVal, ClassLoader loader)
,但找不到使用它的示例。
如果通过压平 map 并相应地写入/读取,如何从构造函数中提取包裹? (从 parcelable 构建 map 时出错,在调用构造函数之前无法访问 buildTheMap()
)
class CachedData(val type: Int,
val name: String,
val details: HashMap<String, String) :
Parcelable {
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString(),
// how to get the hashMap out of the parcel???
buildTheMap(parcel) //<=== cannot access buildTheMap() before constructor is called
)
fun buildTheMap(parcel: Parcel) :HashMap<String, String> {
val size = parcel.readInt()
val map = HashMap<String, String>()
for (i in 1..size) {
val key = parcel.readString()
val value = parcel.readString()
map[key] = value
}
return map
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(type)
parcel.writeString(name)
// how to write the HashMap<String, String> to the parcel
//parcel.???
parcel.writeInt(details.size)
for ((key, value) in details) {
parcel.writeString(key)
parcel.writeString(value)
}
}
override fun describeContents(): Int {
return 0
}
companion object {
@JvmField val CREATOR: Parcelable.Creator<CachedData> = object : Parcelable.Creator<CachedData>{
override fun createFromParcel(parcel: Parcel): CachedData {
return CachedData(parcel)
}
override fun newArray(size: Int): Array<CachedData?> {
return arrayOfNulls(size)
}
}
}
最佳答案
我也遇到过同样的问题。对我有用的解决方案是:
public class JoustBattler extends Parcelable {
...
private Map<String, Integer> battleWins;
protected JoustBattler(Parcel in) {
super(in);
int battleWinsSize = in.readInt();
this.battleWins = new HashMap<String, Integer>(battleWinsSize);
for (int i = 0; i < battleWinsSize; i++) {
String key = in.readString();
Integer value = (Integer) in.readValue(Integer.class.getClassLoader());
this.battleWins.put(key, value);
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.battleWins.size());
for (Map.Entry<String, Integer> entry : this.battleWins.entrySet()) {
dest.writeString(entry.getKey());
dest.writeValue(entry.getValue());
}
}
希望对你有帮助,祝你好运!
关于android - kotlin,如何将HashMap放入Parcelable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51449891/