【问题标题】:Android HashMap in Bundle?Bundle中的Android HashMap?
【发布时间】:2012-07-12 06:19:49
【问题描述】:

android.os.Message 使用 Bundle 通过它的 sendMessage 方法发送。因此,是否可以将HashMap 放在Bundle 中?

【问题讨论】:

标签: android dictionary bundle


【解决方案1】:

尝试:

Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);

在第二个活动中

Bundle bundle = this.getIntent().getExtras();

if(bundle != null) {
   hashMap = bundle.getSerializable("HashMap");
}

因为Hashmap 默认实现Serializable,所以您可以在Bundle 中使用putSerializable 传递它,并使用getSerializable 进入其他活动

【讨论】:

  • 尝试序列化链接的哈希映射 Parcel 时出现错误:无法编组值 com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
  • 我可以将这个方法用于包含原始数据类型和另一个对象的数组列表的对象吗??
  • 如果您遇到问题,请确保您使用的是 HashMap 而不是 Map
  • 您可能希望通过以下方式将返回的可序列化对象转换为 hashmap (HashMap)
  • 这会产生有关未经检查的演员表的警告。这可以忽略吗?
【解决方案2】:

根据docHashmap实现Serializable,所以你可以putSerializable我猜。你试过了吗?

【讨论】:

    【解决方案3】:

    请注意:如果您使用的是 AppCompatActivity,则必须调用 protected void onSaveInstanceState(Bundle outState) {} (NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}) 方法。

    示例代码...

    存储地图:

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable("leftMaxima", leftMaxima);
        outState.putSerializable("rightMaxima", rightMaxima);
    }
    

    并在 onCreate 中接收:

    if (savedInstanceState != null) {
        leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
        rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
    }
    

    对不起,如果它是某种重复的答案 - 也许有人会发现它很有用。 :)

    【讨论】:

      【解决方案4】:

      如果你想发送捆绑包中的所有密钥,你可以试试

      for(String key: map.keySet()){
          bundle.putStringExtra(key, map.get(key));
      }
      

      【讨论】:

      • 我很好奇是否有任何理由不这样做?我没有太多使用序列化,也从不捆绑(android 新手),所以我很好奇这是否是 O(n) 并且附加到捆绑包实际上是否是 O(1)。如果它们的成本没有什么不同,那就不明白你为什么要费心将它序列化到另一个地图中。
      • @CaptainPrinny 除非地图是您映射到捆绑包的唯一内容,否则您可能会破坏值并且您不知道键是原始地图的一部分还是只是存储在捆绑。
      【解决方案5】:
        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;
      }
      

      【讨论】:

        【解决方案6】:

        我正在使用我的 Parcelable 的 kotlin 实现来实现这一点,到目前为止它对我有用。 如果您想避免繁重的可序列化,这很有用。

        另外,为了让它工作,我建议将它与these一起使用

        声明

        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)
                }
            }
        
        }
        

        使用

        val map = LinkedHashMap<Int, String>()
        val wrap = ParcelableMap<Int,String>(map)
        Bundle().putParcelable("your_key", wrap)
        

        阅读

        val bundle = fragment.arguments ?: Bundle()
        val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
        val map = wrap.map
        

        不要忘记,如果你的地图K,V默认没有打包,他们必须实现Parcelable

        【讨论】:

        • 您是否尝试使用@Parcelize 缩短?
        【解决方案7】:

        在 Kotlin 中:

        hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass>
        
        putSerializable(ARG_HASH_MAP, hashMap)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-25
          • 2013-11-24
          • 2021-12-10
          • 2014-11-29
          • 1970-01-01
          • 2013-03-22
          • 1970-01-01
          • 2015-07-08
          相关资源
          最近更新 更多