在android中将Map转换为Bundle

时间:2016-05-26 19:13:13

标签: android firebase bundle firebase-cloud-messaging

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

为什么吗

Firebase会返回通知地图getData()。我需要将数据传递给intent。以前GCM给了我一个包,所以我不需要担心这个。

8 个答案:

答案 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)