有没有一种简单的方法可以在没有显式迭代的情况下将 Map 转换为 Android 中的 Bundle?
为什么?
Firebase 返回一个 Map 用于 Notification getData()
。我需要将数据传递给意图。以前 GCM 给了我一个捆绑包,所以我不需要担心这个。
有没有一种简单的方法可以在没有显式迭代的情况下将 Map 转换为 Android 中的 Bundle?
为什么?
Firebase 返回一个 Map 用于 Notification getData()
。我需要将数据传递给意图。以前 GCM 给了我一个捆绑包,所以我不需要担心这个。
我想一个好的老式 for 循环是最简单的方法:
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
使用扩展运算符的整洁 Kotlin 解决方案如下所示:
fun Map<String, Any?>.toBundle(): Bundle = bundleOf(*this.toList().toTypedArray())
遇到了与 firebase 消息传递相同的问题,并为它创建了一个 kotlin 扩展函数。要点在这里,代码如下。虽然我使用这种方法,但有一些注意事项:
考虑到这一点,请将其用作指导而非最终解决方案。随着它的发展,我会不断更新要点。
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()
}
}
}
现在你可以使用fun bundleOf(vararg pairs: Pair<String, Any?>)
您可以使用它writeToParcel(Parcel out, int flags)
来生成Parcel
类似有用的 a,因为它是 的父类Bundle
,并且它作为类的一部分轻松内置到 Firebase 框架中RemoteMessage
。文档在这里。
这是我在 Kotlin 中的做法
val bundle = Bundle()
for (entry in data.entries)
bundle.putString(entry.key, entry.value)
备查
将映射转换为字符串
fun Map<String, String>.convertExtraMapToString(): String? {
return keys.stream()
.map { key: String -> "$key=" + this[key] }.collect(Collectors.joining(", ", "{", "}"))
}
将 String 转换为 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())
}
}
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)