Ответ 1
Я думаю, что старый старинный цикл - самый простой способ:
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
Есть ли простой способ конвертировать карту в Bundle в android без явной итерации?
Почему?
Firebase возвращает карту для уведомления getData()
. Мне нужно передать данные в намерение. Раньше GCM давала мне комплект, поэтому мне не нужно было об этом беспокоиться.
Я думаю, что старый старинный цикл - самый простой способ:
Bundle bundle = new Bundle();
for (Map.Entry<String, String> entry : getData().entrySet()) {
bundle.putString(entry.getKey(), entry.getValue());
}
Наткнулся на эту же проблему с Firebase Messaging и создал для нее функцию расширения kotlin. Суть здесь, код ниже. Хотя я использую этот метод, есть некоторые оговорки:
Имея это в виду, пожалуйста, используйте его как руководство, а не как окончательное решение. Я буду обновлять суть по мере развития.
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
, и он удобно встроен в инфраструктуру Firebase как часть класса RemoteMessage
. Документация здесь.
вот как я это сделал в Котлине
val bundle = Bundle()
for (entry in data.entries)
bundle.putString(entry.key, entry.value)
В настоящее время вы можете использовать fun bundleOf(vararg pairs: Pair<String, Any?>)
private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)