android - kotlin,如何将HashMap放入Parcelable

标签 android kotlin hashmap parcelable

在实现 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/

相关文章:

java - Arcgis Esri未显示在Android设备上的 map 上

kotlin - 如果在并行流上运行,collect 是否会返回列表快照?

java - 如何根据键值将 2 个 ArrayList<HashMap<String, String>> 合并为 1 个?

存储在 HashMap 中的 Java 泛型 Pair<String, String> 未正确检索键-> 值

java - 在 HashMap Java 中存储数据

android - 不使用 View.onDraw 和 canvas.setMatrix 缩放 subview

android - 进度条 setProgress() 上的应用程序崩溃

java - 如何创建用于与 Android 应用程序通信的服务器

java - Android - 2 个应用程序之间的 SharedPreferences 无法有效工作

java - 仅当变量为空时才在 Kotlin 中实例化变量?