我有一个通用的字符串映射(Key,Value),这个字段是Bean的一部分,我需要它是可打包的。因此,我可以使用Parcel#writeMap方法。API文档中写道:
请改用writeBundle(捆绑包)。在当前dataPosition()处将地图展平到地块中,如果需要,可以增加dataCapacity()。映射关键字必须是字符串对象。映射值是使用writeValue(Object)编写的,并且必须遵循那里的规范。强烈建议使用writeBundle( Bundle )而不是此方法,因为Bundle类提供了一个类型安全的API,允许您在编组时避免神秘的类型错误。
因此,我可以遍历Map中的每个条目,并将其放入Bundle中,但我仍然在寻找一种更聪明的方式来这样做。Android SDK中有没有我遗漏的方法?
目前我是这样做的:
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);
发布于 2013-01-12 14:16:26
我最终做了一些不同的事情。它遵循您在处理Parcelables
时所期望的模式,因此应该很熟悉。
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
中提取的密钥将以相同的顺序出现。
发布于 2011-11-24 17:27:40
您可以尝试:
bundle.putSerializable(yourSerializableMap);
如果您选择的地图实现了可序列化(如HashMap),那么您就可以轻松地使用writeBundle
发布于 2014-08-29 04:59:58
如果地图的key
和value
都扩展了Parcelable
,那么您就可以有一个非常好的泛型解决方案:
代码
// 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;
}
用法
// 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);
https://stackoverflow.com/questions/8254654
复制相似问题