Android明示的な反復なしでマップをバンドルに変換する簡単な方法はありますか?
なぜ?
Firebaseは、通知getData()
のマップを返します。データをインテントに渡す必要があります。以前はGCMがバンドルを提供してくれたので、これについて心配する必要はありませんでした。
昔ながらのforループが最も簡単な方法だと思います。
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
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()
}
}
}
writeToParcel(Parcel out, int flags)
を使用してParcel
を生成できます。これはBundle
の親クラスであり、RemoteMessage
クラス。ドキュメントは こちら です。
コトリンでやった方法はこちら
val bundle = Bundle()
for (entry in data.entries)
bundle.putString(entry.key, entry.value)