首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何以一种智能的方式将Java.util.Map写入到包中?

如何以一种智能的方式将Java.util.Map写入到包中?
EN

Stack Overflow用户
提问于 2011-11-24 17:20:43
回答 7查看 37.1K关注 0票数 64

我有一个通用的字符串映射(Key,Value),这个字段是Bean的一部分,我需要它是可打包的。因此,我可以使用Parcel#writeMap方法。API文档中写道:

请改用writeBundle(捆绑包)。在当前dataPosition()处将地图展平到地块中,如果需要,可以增加dataCapacity()。映射关键字必须是字符串对象。映射值是使用writeValue(Object)编写的,并且必须遵循那里的规范。强烈建议使用writeBundle( Bundle )而不是此方法,因为Bundle类提供了一个类型安全的API,允许您在编组时避免神秘的类型错误。

因此,我可以遍历Map中的每个条目,并将其放入Bundle中,但我仍然在寻找一种更聪明的方式来这样做。Android SDK中有没有我遗漏的方法?

目前我是这样做的:

代码语言:javascript
复制
final Bundle bundle = new Bundle();
final Iterator<Entry<String, String>> iter = links.entrySet().iterator();
while(iter.hasNext())
{
    final Entry<String, String>  entry =iter.next();
    bundle.putString(entry.getKey(), entry.getValue());
}
parcel.writeBundle(bundle);
EN

回答 7

Stack Overflow用户

发布于 2013-01-12 14:16:26

我最终做了一些不同的事情。它遵循您在处理Parcelables时所期望的模式,因此应该很熟悉。

代码语言:javascript
复制
public void writeToParcel(Parcel out, int flags){
  out.writeInt(map.size());
  for(Map.Entry<String,String> entry : map.entrySet()){
    out.writeString(entry.getKey());
    out.writeString(entry.getValue());
  }
}

private MyParcelable(Parcel in){
  //initialize your map before
  int size = in.readInt();
  for(int i = 0; i < size; i++){
    String key = in.readString();
    String value = in.readString();
    map.put(key,value);
  }
}

在我的应用程序中,键在映射中的顺序很重要。我使用LinkedHashMap来保存顺序,这样做可以保证从Parcel中提取的密钥将以相同的顺序出现。

票数 88
EN

Stack Overflow用户

发布于 2011-11-24 17:27:40

您可以尝试:

代码语言:javascript
复制
bundle.putSerializable(yourSerializableMap);

如果您选择的地图实现了可序列化(如HashMap),那么您就可以轻松地使用writeBundle

票数 28
EN

Stack Overflow用户

发布于 2014-08-29 04:59:58

如果地图的keyvalue都扩展了Parcelable,那么您就可以有一个非常好的泛型解决方案:

代码

代码语言:javascript
复制
// For writing to a Parcel
public <K extends Parcelable,V extends Parcelable> void writeParcelableMap(
        Parcel parcel, int flags, Map<K, V > map)
{
    parcel.writeInt(map.size());
    for(Map.Entry<K, V> e : map.entrySet()){
        parcel.writeParcelable(e.getKey(), flags);
        parcel.writeParcelable(e.getValue(), flags);
    }
}

// For reading from a Parcel
public <K extends Parcelable,V extends Parcelable> Map<K,V> readParcelableMap(
        Parcel parcel, Class<K> kClass, Class<V> vClass)
{
    int size = parcel.readInt();
    Map<K, V> map = new HashMap<K, V>(size);
    for(int i = 0; i < size; i++){
        map.put(kClass.cast(parcel.readParcelable(kClass.getClassLoader())),
                vClass.cast(parcel.readParcelable(vClass.getClassLoader())));
    }
    return map;
}

用法

代码语言:javascript
复制
// MyClass1 and MyClass2 must extend Parcelable
Map<MyClass1, MyClass2> map;

// Writing to a parcel
writeParcelableMap(parcel, flags, map);

// Reading from a parcel
map = readParcelableMap(parcel, MyClass1.class, MyClass2.class);
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8254654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档