有没有一种简单的方法可以在没有显式迭代的情况下将Map转换为bundle中的Bundle?
为什么吗
Firebase会返回通知地图getData()
。我需要将数据传递给intent。以前GCM给了我一个包,所以我不需要担心这个。
答案 0 :(得分:42)
我认为一个好的老式for循环是最简单的方法:
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
答案 1 :(得分:7)
遇到了与firebase消息传递相同的问题,并为其创建了kotlin扩展功能。 gist is here,代码如下。虽然我使用这种方法有一些警告:
考虑到这一点,请将其作为指南而不是最终解决方案。随着它的发展,我将保持最新的要点。
import android.os.Bundle
import android.os.IBinder
import android.os.Parcelable
import java.io.Serializable
fun <V> Map<String, V>.toBundle(bundle: Bundle = Bundle()): Bundle = bundle.apply {
forEach {
val k = it.key
val v = it.value
when (v) {
is IBinder -> putBinder(k, v)
is Bundle -> putBundle(k, v)
is Byte -> putByte(k, v)
is ByteArray -> putByteArray(k, v)
is Char -> putChar(k, v)
is CharArray -> putCharArray(k, v)
is CharSequence -> putCharSequence(k, v)
is Float -> putFloat(k, v)
is FloatArray -> putFloatArray(k, v)
is Parcelable -> putParcelable(k, v)
is Serializable -> putSerializable(k, v)
is Short -> putShort(k, v)
is ShortArray -> putShortArray(k, v)
// is Size -> putSize(k, v) //api 21
// is SizeF -> putSizeF(k, v) //api 21
else -> throw IllegalArgumentException("$v is of a type that is not currently supported")
// is Array<*> -> TODO()
// is List<*> -> TODO()
}
}
}
答案 2 :(得分:7)
使用传播算子的整洁Kotlin解决方案如下所示:
fun Map<String, Any?>.toBundle(): Bundle = bundleOf(*this.toList().toTypedArray())
答案 3 :(得分:2)
现在您可以使用fun bundleOf(vararg pairs: Pair<String, Any?>)
答案 4 :(得分:1)
您可以使用writeToParcel(Parcel out, int flags)
生成可能同样有用的Parcel
,因为它是Bundle
的父类,并且可以作为{{}}的一部分轻松构建到Firebase框架中{1}}课程。文档为here。
答案 5 :(得分:0)
这是我在科特林做的事
navigationOptions
答案 6 :(得分:0)
供以后参考?
<块引用>将地图转换为字符串
fun Map<String, String>.convertExtraMapToString(): String? {
return keys.stream()
.map { key: String -> "$key=" + this[key] }.collect(Collectors.joining(", ", "{", "}"))
}
<块引用>
将字符串转换为 Map 然后转换为 Bundle
fun String.convertExtraMapToBundle(): Bundle {
return Arrays.stream(split(",".toRegex()).toTypedArray())
.map { entry: String -> entry.split("=".toRegex()).toTypedArray() }
.collect(Collectors.toMap(
{ entry: Array<String> -> entry[0] }) { entry: Array<String> -> entry[1] }).let {
bundleOf(*it.toList().toTypedArray())
}
}
答案 7 :(得分:-5)
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)