HashMap do Android no pacote?

90

O android.os.Messageusa um Bundlepara enviar com seu método sendMessage. Portanto, é possível colocar um HashMapdentro de um Bundle?

Marcus Toepper
fonte
java E android newbie 8) thnx a todos!
Marcus Toepper
Aceite qualquer resposta se resolvermos seu problema. thx
AMerle

Respostas:

164

tente como:

Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);

e na segunda atividade

Bundle bundle = this.getIntent().getExtras();

if(bundle != null) {
   hashMap = bundle.getSerializable("HashMap");
}

porque o Hashmap por padrão implementa Serializablepara que você possa passá-lo usando putSerializableno Bundle e entrar em outra atividade usandogetSerializable

ρяσѕρєя K
fonte
Estou recebendo um erro ao tentar serializar o mapa de hash vinculado Parcel: não foi possível empacotar o valor com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ
1
Posso usar este método para objeto que contém tipo de dados primitivos e lista de matriz de outro objeto?
SweetWisher ツ
3
Se você estiver tendo problemas, certifique-se de usar o HashMap e não o Mapa
Mateus
1
você pode querer lançar o objeto serializável retornado para o hashmap das seguintes maneiras (HashMap <String, Integer>)
cammando
3
Isso produz um aviso sobre elenco não verificado. É seguro ignorar isso?
mitsest de
12

De acordo com o doc , Hashmapimplementa Serializable, então você pode putSerializableadivinhar. Você experimentou?

AMerle
fonte
6

Observação: se você estiver usando uma AppCompatActivity, terá que chamar o método protected void onSaveInstanceState(Bundle outState) {}( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} ).

Código de exemplo ...

Armazene o mapa:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("leftMaxima", leftMaxima);
    outState.putSerializable("rightMaxima", rightMaxima);
}

E receba em onCreate:

if (savedInstanceState != null) {
    leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
    rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}

Desculpe se é algum tipo de resposta duplicada - talvez alguém ache útil. :)

Martin Pfeffer
fonte
4

Se você deseja enviar todas as chaves do pacote, você pode tentar

for(String key: map.keySet()){
    bundle.putStringExtra(key, map.get(key));
}
Kapil Vats
fonte
Estou curioso para saber se há alguma razão para não fazer isso? Eu não usei muito a serialização e nunca os pacotes (novo no android), então estou curioso se este é O (n) e anexar a um pacote é efetivamente O (1) ou não. Se não forem diferentes em custo, não vejo por que você se preocuparia em serializá-los em outro mapa.
Capitão Prinny de
@CaptainPrinny, a menos que o mapa seja a única coisa que você está mapeando para o pacote, você pode destruir valores e não saberá se uma chave fazia parte do mapa original ou apenas um valor armazenado no pacote.
Jason
1
  public static Bundle mapToBundle(Map<String, Object> data) throws Exception {
    Bundle bundle = new Bundle();
    for (Map.Entry<String, Object> entry : data.entrySet()) {
        if (entry.getValue() instanceof String)
            bundle.putString(entry.getKey(), (String) entry.getValue());
        else if (entry.getValue() instanceof Double) {
            bundle.putDouble(entry.getKey(), ((Double) entry.getValue()));
        } else if (entry.getValue() instanceof Integer) {
            bundle.putInt(entry.getKey(), (Integer) entry.getValue());
        } else if (entry.getValue() instanceof Float) {
            bundle.putFloat(entry.getKey(), ((Float) entry.getValue()));
        }
    }
    return bundle;
}
Jasss
fonte
1

Estou usando minha implementação kotlin do Parcelable para conseguir isso e, até agora, ele funciona para mim. É útil se você deseja evitar a serialização pesada.

Também para que funcione, recomendo usá-lo com estes

Declaração

class ParcelableMap<K,V>(val map: MutableMap<K,V>) : Parcelable {
    constructor(parcel: Parcel) : this(parcel.readMap(LinkedHashMap<K,V>()))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeMap(map)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<ParcelableMap<Any?,Any?>> {
        @JvmStatic
        override fun createFromParcel(parcel: Parcel): ParcelableMap<Any?,Any?> {
            return ParcelableMap(parcel)
        }
        @JvmStatic 
        override fun newArray(size: Int): Array<ParcelableMap<Any?,Any?>?> {
            return arrayOfNulls(size)
        }
    }

}

Usar

escrever

val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)

ler

val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map

Não se esqueça de que se o seu mapa K,Vnão for dividido por padrão, eles devem implementarParcelable

Jocky Doe
fonte
1
Você tentou encurtar com @Parcelize?
CoolMind
0

Em Kotlin:

hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass>

putSerializable(ARG_HASH_MAP, hashMap)
CoolMind
fonte