52

有没有一种简单的方法可以在没有显式迭代的情况下将 Map 转换为 Android 中的 Bundle?

为什么?

Firebase 返回一个 Map 用于 Notification getData()。我需要将数据传递给意图。以前 GCM 给了我一个捆绑包,所以我不需要担心这个。

4

8 回答 8

57

我想一个好的老式 for 循环是最简单的方法:

    Bundle bundle = new Bundle();
    for (Map.Entry<String, String> entry : getData().entrySet()) {
        bundle.putString(entry.getKey(), entry.getValue());
    }
于 2016-05-26T20:26:24.460 回答
20

使用扩展运算符的整洁 Kotlin 解决方案如下所示:

fun Map<String, Any?>.toBundle(): Bundle = bundleOf(*this.toList().toTypedArray())
于 2020-07-07T17:35:20.123 回答
14

遇到了与 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()
    }
  }
}
于 2017-01-07T13:58:23.847 回答
12

现在你可以使用fun bundleOf(vararg pairs: Pair<String, Any?>)

于 2019-10-03T12:54:50.080 回答
1

您可以使用它writeToParcel(Parcel out, int flags)来生成Parcel类似有用的 a,因为它是 的父类Bundle,并且它作为类的一部分轻松内置到 Firebase 框架中RemoteMessage。文档在这里

于 2016-09-07T05:28:14.817 回答
1

这是我在 Kotlin 中的做法

val bundle = Bundle()

for (entry in data.entries)
    bundle.putString(entry.key, entry.value)
于 2019-02-21T14:25:28.950 回答
-1

备查

将映射转换为字符串

  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())
        }
}
于 2021-03-29T13:42:51.830 回答
-9
 private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)
于 2016-09-01T14:19:34.630 回答