Подтвердить что ты не робот

Преобразование карты в Bundle в android

Есть ли простой способ конвертировать карту в Bundle в android без явной итерации?

Почему?

Firebase возвращает карту для уведомления getData(). Мне нужно передать данные в намерение. Раньше GCM давала мне комплект, поэтому мне не нужно было об этом беспокоиться.

4b9b3361

Ответ 1

Я думаю, что старый старинный цикл - самый простой способ:

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

Ответ 2

Наткнулся на эту же проблему с 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()
    }
  }
}

Ответ 3

Вы можете использовать writeToParcel(Parcel out, int flags) для создания Parcel, который может быть аналогичным образом полезен, поскольку он является родительским классом Bundle, и он удобно встроен в инфраструктуру Firebase как часть класса RemoteMessage. Документация здесь.

Ответ 4

вот как я это сделал в Котлине

val bundle = Bundle()

for (entry in data.entries)
    bundle.putString(entry.key, entry.value)

Ответ 5

В настоящее время вы можете использовать fun bundleOf(vararg pairs: Pair<String, Any?>)

Ответ 6

 private ArrayList<Bundle> convertMapToBundleList(ArrayList<HashMap<String, String>> mapList)