在实现Parcelable的类中,它具有HashMap成员。
看见包裹可具有
public final void readMap(Map outVal, ClassLoader loader)
,但找不到使用它的示例。
如果通过展平地图并相应地逐一写入/读取操作,如何从构造函数中的地块中提取数据? (在从cannot access buildTheMap() before constructor is called
地块生成地图时出错)
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)
}
}
}
}
答案 0 :(得分:3)
对我来说,面临着同样的问题。为我工作的解决方案是:
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());
}
}
希望有帮助,祝您好运!
答案 1 :(得分:3)
仍然希望一些人分享如何使用readMap()。
以下是Kotlin版本,可以平整地图,以供参考。
class CachedData :
Parcelable {
var type: Int = 0
var name: String = ""
var details: HashMap<String, String> = HashMap()
constructor (type: Int,
name: String,
details: HashMap<String, String>) {
this.type = type
this.name = name
this.details = details
}
constructor(parcel: Parcel) {
this.type = parcel.readInt()
this.name = parcel.readString()
this.details = buildTheMap(parcel)
}
fun buildTheMap(parcel: Parcel): HashMap<String, String> {
val size = parcel.readInt()
val map = HashMap<String, String>(size)
for (i in 1..size) {
val key = parcel.readString()
val value = parcel.readString()
map[key] = value
}
return map
}
fun writeToMap(parcel: Parcel) {
parcel.writeInt(details.size)
for ((key, value) in details) {
parcel.writeString(key)
parcel.writeString(value)
}
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(type)
parcel.writeString(name)
writeToMap(parcel)
}
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)
}
}
}
}
答案 2 :(得分:1)
使用@Parcelize
并写
@Parcelize
class CachedData(val type: Int, val name: String, val details: HashMap<String, String>) : Parcelable
它内置了对HashMap
(和其他集合类型)的支持。