2016-05-26 31 views
23

C'è un modo semplice per convertire una mappa in un pacchetto in Android senza iterazione esplicita?Converti mappa in bundle in android

Perché?

Firebase restituisce una mappa per notifica getData(). Ho bisogno di passare i dati a un intento. Precedentemente GCM mi ha dato un pacchetto, quindi non dovevo preoccuparmi di questo.

+3

"C'è un modo semplice per convertire una mappa in un pacchetto in Android senza iterazione esplicita?" - nota che una 'Mappa' non equivale necessariamente a un' Bundle'. Una 'Mappa' può avere chiavi che non sono stringhe. Una 'Mappa' può avere valori che non sono uno dei tipi di dati supportati. – CommonsWare

+1

Sì, ma nel mio caso sono tutti primitivi e String –

+0

È possibile serializzarlo. – cyroxis

risposta

26

Credo che un buon ciclo for è il modo più semplice vecchio stile:

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

Nel mio caso questo è buono come si ottiene, suppongo. –

+2

questo probabilmente genererà un'eccezione perché il primo parametro "google_sent_time" ha un tipo Long e stai usando 'putString'. è meglio usare l'intento di gestire la variazione del tipo per te e usare 'intent.putExtra (entry.getKey(), entry.getValue())' così diversi tipi di dati non creano problemi per te. –

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

Si prega di aggiornare e spiegare la risposta. –

1

È possibile utilizzare writeToParcel(Parcel out, int flags) per generare un Parcel che potrebbe essere altrettanto utile, dal momento che è una classe genitore di Bundle, e è facilmente integrato nel framework Firebase come parte della classe RemoteMessage. La documentazione è here.

+0

'Parcel' è una superclasse di' Bundle', quindi mentre può essere altrettanto utile, non può essere usato in modo intercambiabile. –

+0

Sì, ho detto che è la classe genitore di esso. – SQLiteNoob

4

È venuto attraverso questo stesso problema con la messaggistica di Firebase e creato per esso una funzione di estensione kotlin. gist is here, codice di seguito. Anche se io sto usando questo metodo ci sono alcune avvertenze:

  • non copre tutti i tipi che possono essere messi in un fascio
  • è ancora in fase di sviluppo e non è stato completamente testato

Con questo in mente, si prega di utilizzare come guida non una soluzione definitiva. Terrò il succo aggiornato man mano che si evolve.

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

non ha mai sentito parlare di kotlin prima di oggi; scoperta interessante – CCJ