web-dev-qa-db-ja.com

androidでマップをバンドルに変換

Android明示的な反復なしでマップをバンドルに変換する簡単な方法はありますか?

なぜ?

Firebaseは、通知getData()のマップを返します。データをインテントに渡す必要があります。以前はGCMがバンドルを提供してくれたので、これについて心配する必要はありませんでした。

32
Nouvel Travay

昔ながらのforループが最も簡単な方法だと思います。

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

Firebaseメッセージングでこの同じ問題に遭遇し、そのためのkotlin拡張機能を作成しました。 要点はここにあります 、以下のコード。この方法を使用していますが、いくつかの注意事項があります。

  • バンドルに入れることができるすべてのタイプを網羅しているわけではありません
  • まだ開発中であり、完全にはテストされていません

これを念頭に置いて、決定的な解決策ではなくガイドとして使用してください。 Gistが進化しても最新の状態に保ちます。

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

writeToParcel(Parcel out, int flags)を使用してParcelを生成できます。これはBundleの親クラスであり、RemoteMessageクラス。ドキュメントは こちら です。

1
SQLiteNoob

コトリンでやった方法はこちら

val bundle = Bundle()

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