マップを明示的な反復なしでアンドロイドのバンドルに変換する簡単な方法はありますか?マップをアンドロイドのバンドルに変換する
なぜですか?
Firebaseは通知用マップgetData()
を返します。データを意図に渡す必要があります。以前はGCMからバンドルされていたので、これについて心配する必要はありませんでした。
マップを明示的な反復なしでアンドロイドのバンドルに変換する簡単な方法はありますか?マップをアンドロイドのバンドルに変換する
なぜですか?
Firebaseは通知用マップgetData()
を返します。データを意図に渡す必要があります。以前はGCMからバンドルされていたので、これについて心配する必要はありませんでした。
私はループの昔ながらの古き良きが最も簡単な方法だと思います:それはBundle
の親クラスですので、あなたは、同様に有用である可能性Parcel
を生成するwriteToParcel(Parcel out, int flags)
を使用することができます
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
私の場合、これはそれが得られるほど良いと思います。 –
最初のパラメータ "google_sent_time"がLong型で、あなたが 'putString'を使用しているため、これはおそらく例外をスローします。 Intent.putExtra(entry.getKey()、entry.getValue()) 'を使用すると、異なるタイプのデータ型が問題にならないようになります。 –
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)
あなたの答えを更新して説明してください。 –
、およびRemoteMessage
クラスの一部としてFirebaseフレームワークに組み込まれています。ドキュメントはhereです。
'Parcel'は' Bundle'のスーパークラスなので、同様に便利ですが、互換性をもって使用することはできません。 –
うん、それはそれの親クラスだと言及した。 – SQLiteNoob
firebaseメッセージでこの同じ問題を解決し、kotlin拡張機能を作成しました。 gist is here、以下のコード。私はこの方法を使用しておりますが、いくつかの注意点があります。
これを念頭に置いて、決定的な解決策ではなく、参考にしてください。それが進展するにつれ、要点を最新に保ちます。
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()
}
}
}
今日の前にコトリンについて聞いたことはありません。興味深い発見 – CCJ
「マップを明白な反復なしでアンドロイドのバンドルに簡単に変換できますか?」 - 'Map'は必ずしも' Bundle'と同じではありません。 'Map'は文字列ではないキーを持つことができます。 'Map'は、サポートされているデータ型の1つではない値を持つことができます。 – CommonsWare
はい、私の場合はすべてプリミティブと文字列です –
あなたはそれをシリアル化することができます。 – cyroxis