Convert Map to Bundle in android

2019-03-14 07:03发布

Is there an easy way to convert a Map to a Bundle in android without explicit iteration?

Why?

Firebase returns a Map for Notification getData(). I need to pass the data to an intent. Formerly GCM gave me a bundle, so I didn't need to worry about this.

5条回答
该账号已被封号
2楼-- · 2019-03-14 07:31

here is how I did it in Kotlin

val bundle = Bundle()

for (entry in data.entries)
    bundle.putString(entry.key, entry.value)
查看更多
男人必须洒脱
3楼-- · 2019-03-14 07:36

I guess a good old fashioned for loop is the easiest way:

    Bundle bundle = new Bundle();
    for (Map.Entry<String, String> entry : getData().entrySet()) {
        bundle.putString(entry.getKey(), entry.getValue());
    }
查看更多
劳资没心,怎么记你
4楼-- · 2019-03-14 07:36

Came across this same issue with firebase messaging and created a kotlin extension function for it. The gist is here, code below. Although I am using this method there are some caveats:

  • it doesn't cover all of the types that can be put into a bundle
  • it is still under development and hasn't been fully tested

With this in mind, please use it as a guide not a definitive solution. I will keep the gist up to date as it evolves.

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()
    }
  }
}
查看更多
叛逆
5楼-- · 2019-03-14 07:39

You can use writeToParcel(Parcel out, int flags)to generate a Parcel that could be similarly useful, since it's a parent class of Bundle, and it's handily built into the Firebase framework as part of the RemoteMessage class. Documentation is here.

查看更多
兄弟一词,经得起流年.
6楼-- · 2019-03-14 07:43
 private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)
查看更多
登录 后发表回答