web-dev-qa-db-fra.com

Convertir la carte en bundle en android

Existe-t-il un moyen simple de convertir une carte en bundle dans Android sans itération explicite?

Pourquoi?

Firebase renvoie une carte pour la notification getData(). J'ai besoin de transmettre les données à une intention. Auparavant, GCM me donnait un bundle, donc je n'avais pas à m'en soucier.

32
Nouvel Travay

Je suppose qu'une bonne boucle à l'ancienne est le moyen le plus simple:

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

Nous sommes tombés sur ce même problème avec la messagerie Firebase et avons créé une fonction d'extension kotlin pour cela. Le Gist est ici , code ci-dessous. Bien que j'utilise cette méthode, il y a quelques mises en garde:

  • il ne couvre pas tous les types pouvant être regroupés
  • il est encore en développement et n'a pas été entièrement testé

Dans cet esprit, veuillez l'utiliser comme guide et non comme une solution définitive. Je tiendrai le Gist à jour au fur et à mesure de son évolution.

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()
    }
  }
}
8
Bulwinkel

Vous pouvez utiliser writeToParcel(Parcel out, int flags) pour générer un Parcel qui pourrait être également utile, car il s'agit d'une classe parente de Bundle, et il est facilement intégré au cadre Firebase dans le cadre du RemoteMessage classe. La documentation est ici .

1
SQLiteNoob

voici comment je l'ai fait à Kotlin

val bundle = Bundle()

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