2016-05-26 3 views
23

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

なぜですか?

Firebaseは通知用マップgetData()を返します。データを意図に渡す必要があります。以前はGCMからバンドルされていたので、これについて心配する必要はありませんでした。

+3

「マップを明白な反復なしでアンドロイドのバンドルに簡単に変換できますか?」 - 'Map'は必ずしも' Bundle'と同じではありません。 'Map'は文字列ではないキーを持つことができます。 'Map'は、サポートされているデータ型の1つではない値を持つことができます。 – CommonsWare

+1

はい、私の場合はすべてプリミティブと文字列です –

+0

あなたはそれをシリアル化することができます。 – cyroxis

答えて

26

私はループの昔ながらの古き良きが最も簡単な方法だと思います:それは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()); 
    } 
+0

私の場合、これはそれが得られるほど良いと思います。 –

+2

最初のパラメータ "google_sent_time"がLong型で、あなたが 'putString'を使用しているため、これはおそらく例外をスローします。 Intent.putExtra(entry.getKey()、entry.getValue()) 'を使用すると、異なるタイプのデータ型が問題にならないようになります。 –

-2
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList) 
+0

あなたの答えを更新して説明してください。 –

1

、およびRemoteMessageクラスの一部としてFirebaseフレームワークに組み込まれています。ドキュメントはhereです。

+0

'Parcel'は' Bundle'のスーパークラスなので、同様に便利ですが、互換性をもって使用することはできません。 –

+0

うん、それはそれの親クラスだと言及した。 – SQLiteNoob

4

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

今日の前にコトリンについて聞いたことはありません。興味深い発見 – CCJ

関連する問題