将地图转换为Android包

问题描述 投票:32回答:6

是否有一种简单的方法可将android中的Map转换为Bundle,而无需进行显式迭代?

为什么?

Firebase返回通知getData()的映射。我需要将数据传递给意图。以前,GCM给了我一捆,所以我不必为此担心。

android firebase bundle firebase-cloud-messaging
6个回答
47
投票

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

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

8
投票

通过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()
    }
  }
}

1
投票

您可以使用writeToParcel(Parcel out, int flags)生成可能同样有用的Parcel,因为它是Bundle的父类,并且作为RemoteMessage类的一部分方便地内置在Firebase框架中。文档为here


1
投票

这是我在科特林做的事情

val bundle = Bundle()

for (entry in data.entries)
    bundle.putString(entry.key, entry.value)

0
投票

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


-5
投票
 private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)
© www.soinside.com 2019 - 2024. All rights reserved.