Bundle'da Android HashMap?


91

android.os.MessageBir kullanır Bundle's sendMessage-yöntemi ile göndermek. Bu nedenle, HashMapiçine a koymak mümkün müdür Bundle?


java VE android acemi 8) hepsi thnx!
Marcus Toepper

Sorununuzu çözdüysek herhangi bir cevabı kabul edin. thx
AMerle


Yanıtlar:


165

olarak deneyin:

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

ve ikinci Faaliyette

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

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

Çünkü HashMap varsayılan implementlerin SerializableEğer kullanarak geçmek böylece putSerializableBundle ve kullanan diğer aktivitede olsungetSerializable


Bağlantılı karma haritayı serileştirmeye çalışırken hata alıyorum Parcel: değeri com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ

1
İlkel veri türü ve başka bir nesnenin dizi listesini içeren nesne için bu yöntemi kullanabilir miyim?
SweetWisherツ

3
Sorun yaşıyorsanız HashMap not Map'i kullandığınızdan emin olun
Matthew

1
Döndürülen serileştirilebilir nesneyi aşağıdaki yollarla
hashmap'e dönüştürmek isteyebilirsiniz

3
Bu, kontrol edilmeyen atama hakkında bir uyarı oluşturur. Bunu görmezden gelmek güvenli mi?
mitsest

12

Göre doc , Hashmapuygular Serializable, böylece yapabilirsiniz putSerializablesanırım. Onu denedin mi ?


6

Lütfen dikkat: Bir AppCompatActivity kullanıyorsanız, protected void onSaveInstanceState(Bundle outState) {}( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} ) yöntemini çağırmanız gerekecektir .

Örnek kod ...

Haritayı saklayın:

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

Ve onCreate içinde alın:

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

Özür dilerim, eğer bir tür yinelenen cevapsa - belki birisi bunu faydalı bulacaktır. :)


4

Paketteki tüm anahtarları göndermek istiyorsanız, deneyebilirsiniz.

for(String key: map.keySet()){
    bundle.putStringExtra(key, map.get(key));
}

Bunu yapmamak için herhangi bir sebep var mı merak ediyorum? Serileştirmeyi çok kullanmadım ve asla paketler (android için yeni), bu yüzden bunun O (n) olup olmadığını ve bir pakete eklemenin etkili bir şekilde O (1) olup olmadığını merak ediyorum. Maliyet açısından farklı değillerse, neden başka bir haritada seri hale getirmekle uğraştığınızı anlamıyorum.
Captain Prinny

@CaptainPrinny, harita paketle eşleştirdiğiniz tek şey değilse, değerleri bozabilir ve bir anahtarın orijinal haritanın parçası mı yoksa yalnızca pakette depolanan bir değer mi olduğunu bilemezsiniz.
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;
}

1

Bunu başarmak için kotlin Parcelable uygulamamı kullanıyorum ve şu ana kadar benim için çalışıyor. Yoğun serileştirilebilirlikten kaçınmak istiyorsanız kullanışlıdır.

Ayrıca çalışmak için sırayla, ben bunu kullanmanızı öneririz bu

Beyanname

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)
        }
    }

}

Kullanım

yazmak

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

okumak

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

Haritanız K,Vvarsayılan olarak parsellenmemişse,Parcelable


1
@Parcelize ile kısaltmayı denediniz mi?
CoolMind

0

Kotlin'de:

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

putSerializable(ARG_HASH_MAP, hashMap)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.