programacion - Convertir mapa a paquete en android
manual de programacion android pdf (4)
¿Existe una manera fácil de convertir un mapa a un paquete en Android sin iteración explícita?
¿Por qué?
Firebase devuelve un mapa para la notificación getData()
. Necesito pasar los datos a un intento. Anteriormente, GCM me dio un paquete, así que no tenía que preocuparme por esto.
Creo que un buen bucle for old es la manera más fácil:
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
Puede usar writeToParcel(Parcel out, int flags)
para generar un Parcel
que podría ser igualmente útil, ya que es una clase principal de Bundle
, y se integra fácilmente en el marco de Firebase como parte de la clase RemoteMessage
. La documentación está here .
Se encontró con este mismo problema con los mensajes de Firebase y creó una función de extensión de kotlin para él. La esencia está aquí , código debajo. Aunque estoy usando este método, hay algunas advertencias:
- no cubre todos los tipos que se pueden poner en un paquete
- todavía está en desarrollo y no ha sido completamente probado
Con esto en mente, utilícelo como una guía, no como una solución definitiva. Mantendré actualizada la esencia a medida que evoluciona.
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()
}
}
}
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)