Android HashMap ใน Bundle?


91

android.os.Messageใช้Bundleในการส่งด้วยนั้น SendMessage-วิธี ดังนั้นจึงสามารถใส่ a HashMapภายในได้Bundleหรือไม่?


java และ android newbie 8) ขอบคุณทุกคน!
Marcus Toepper

ยอมรับคำตอบหากเราแก้ปัญหาของคุณได้ thx
AMerle


คำตอบ:


165

ลองเป็น:

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

และในกิจกรรมที่สอง

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

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

เนื่องจากHashmap โดยค่าเริ่มต้นใช้งานSerializableเพื่อให้คุณสามารถส่งผ่านโดยใช้putSerializableใน Bundle และเข้าร่วมกิจกรรมอื่น ๆ โดยใช้getSerializable


ฉันได้รับข้อผิดพลาดเมื่อพยายามทำให้เป็นอนุกรมของแผนที่แฮชที่เชื่อมโยง Parcel: ไม่สามารถมาร์ชค่า com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ

1
ฉันสามารถใช้วิธีนี้สำหรับออบเจ็กต์ที่มีชนิดข้อมูลดั้งเดิมและรายการอาร์เรย์ของออบเจ็กต์อื่นได้หรือไม่?
SweetWisher ツ

3
หากคุณประสบปัญหาตรวจสอบให้แน่ใจว่าคุณใช้ HashMap ไม่ใช่แผนที่
Matthew

1
คุณอาจต้องการส่งคืนวัตถุที่ทำให้เป็นอนุกรมได้ไปยังแฮชแมปโดยทำตามวิธีต่างๆ (HashMap <String, Integer>)
cammando

3
สิ่งนี้ทำให้เกิดคำเตือนเกี่ยวกับการร่ายที่ไม่ถูกเลือก สิ่งนี้ปลอดภัยที่จะเพิกเฉยหรือไม่?
mitsest

12

ตามที่doc , HashmapการดำเนินการSerializableเพื่อให้คุณสามารถputSerializableฉันเดา คุณลองหรือยัง?


6

โปรดทราบ: หากคุณใช้ AppCompatActivity คุณจะต้องเรียกใช้ เมธอดprotected void onSaveInstanceState(Bundle outState) {}( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} )

ตัวอย่างโค้ด ...

จัดเก็บแผนที่:

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

และรับใน onCreate:

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

ขออภัยหากเป็นคำตอบที่ซ้ำกัน - อาจมีคนเห็นว่ามีประโยชน์ :)


4

หากคุณต้องการส่งคีย์ทั้งหมดในกลุ่มคุณสามารถลองได้

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

ฉันสงสัยว่ามีเหตุผลอะไรที่จะไม่ทำเช่นนี้? ฉันไม่ได้ใช้การทำให้เป็นอนุกรมมากนักและไม่เคยรวมกลุ่ม (ใหม่สำหรับ Android) ดังนั้นฉันจึงสงสัยว่านี่คือ O (n) และการต่อท้ายบันเดิลนั้นมีประสิทธิภาพ O (1) หรือไม่ หากต้นทุนไม่แตกต่างกันไม่เห็นว่าทำไมคุณถึงต้องกังวลกับการจัดลำดับลงในแผนที่อื่น
Captain Prinny

@CaptainPrinny เว้นแต่ว่าแผนที่จะเป็นเพียงสิ่งเดียวที่คุณกำลังแมปกับบันเดิลคุณอาจมีค่า clobber และคุณจะไม่รู้ว่าคีย์เป็นส่วนหนึ่งของแผนที่ดั้งเดิมหรือเป็นเพียงค่าที่เก็บไว้ในบันเดิล
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

ฉันใช้งาน kotlin ของฉันกับ Parcelable เพื่อให้บรรลุสิ่งนั้นและจนถึงตอนนี้มันก็ใช้ได้ผลสำหรับฉัน จะมีประโยชน์หากคุณต้องการหลีกเลี่ยงการต่ออนุกรมที่หนักหน่วง

นอกจากนี้เพื่อให้ใช้งานได้ฉันขอแนะนำให้ใช้กับสิ่งเหล่านี้

คำประกาศ

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

}

ใช้

เขียน

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

อ่าน

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

อย่าลืมว่าหากแผนที่ของคุณK,Vไม่ได้รับการแยกส่วนตามค่าเริ่มต้นพวกเขาจะต้องใช้งานParcelable


1
คุณพยายามย่อด้วย @Parcelize หรือไม่?
CoolMind

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.