在android中将Map转换为Bundle

Nou*_*vay 32 android bundle firebase firebase-cloud-messaging

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

为什么?

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

Mar*_*ski 49

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

    Bundle bundle = new Bundle();
    for (Map.Entry<String, String> entry : getData().entrySet()) {
        bundle.putString(entry.getKey(), entry.getValue());
    }
Run Code Online (Sandbox Code Playgroud)

  • 这可能会引发异常,因为第一个参数"google_sent_time"有一个Long类型而你正在使用`putString`.你最好使用意图为你处理类型变化,并使用`intent.putExtra(entry.getKey(),entry.getValue())`所以不同的数据类型不会给你带来麻烦. (3认同)
  • @AmirZiarati 我认为这不再是真的,`RemoteMessage#getData()` 现在返回一个 `Map&lt;String, String&gt;`,不包括一堆内部值。 (2认同)

bgp*_*aya 15

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

fun Map<String, Any?>.toBundle(): Bundle = bundleOf(*this.toList().toTypedArray())
Run Code Online (Sandbox Code Playgroud)


bak*_*kua 10

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


Bul*_*kel 8

遇到了与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()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)