57 votes

Convertir la carte en bundle dans Android

Existe-t-il un moyen facile 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.

59voto

Marcin Koziński Points 5845

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());
    }
 

16voto

Bulwinkel Points 1138

Est venu à travers ce même problème avec firebase de messagerie et créé un kotlin extension de la fonction pour cela. L' essentiel est ici, le code ci-dessous. Bien que je suis en utilisant cette méthode il y a quelques mises en garde:

  • elle ne couvre pas tous les types qui peuvent être mis dans un bundle
  • il est encore en cours de développement et n'a pas été entièrement testé

Avec cela à l'esprit, merci de l'utiliser comme un guide pas à une solution définitive. Je vais garder l'essentiel à jour à mesure qu'il évolue.

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

1voto

SQLiteNoob Points 630

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 elle est facilement intégrée dans le cadre Firebase dans le cadre de de la classe RemoteMessage . La documentation est ici .

-10voto

Chetan Sankhla Points 1
 private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X