Android HashMap trong Gói?


90

Sử android.os.Messagedụng a Bundleđể gửi với phương thức sendMessage của nó. Do đó, có thể đặt HashMapbên trong a Bundle?


java VÀ android newbie 8) thnx cho tất cả!
Marcus Toepper

Chấp nhận bất kỳ câu trả lời nào nếu chúng tôi giải quyết được vấn đề của bạn. thx
AMerle


Câu trả lời:


164

cố gắng như:

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

và trong Hoạt động thứ hai

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

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

bởi vì Hashmap theo mặc định triển khai Serializablenên bạn có thể chuyển nó bằng cách sử dụng putSerializabletrong Gói và tham gia vào hoạt động khác bằng cách sử dụnggetSerializable


Tôi gặp lỗi khi cố gắng tuần tự hóa bản đồ băm được liên kết Parcel: không thể điều chỉnh giá trị com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ

1
Tôi có thể sử dụng phương thức này cho đối tượng chứa kiểu dữ liệu nguyên thủy và danh sách mảng của đối tượng khác không ??
SweetWisher ツ

3
Nếu bạn gặp sự cố, hãy đảm bảo rằng bạn đang sử dụng HashMap không phải Bản đồ
Matthew

1
bạn có thể muốn cast đối tượng serializable trở lại hashmap bằng cách sau (HashMap <String, Integer>)
cammando

3
Điều này tạo ra một cảnh báo về diễn viên chưa được kiểm tra. Điều này có an toàn để bỏ qua?
mitsest

12

Theo bác , Hashmapdụng cụ Serializable, vì vậy bạn có thể putSerializableđoán. Bạn đã thử à ?


6

Xin lưu ý: Nếu bạn đang sử dụng AppCompatActivity, bạn sẽ phải gọi phương thức protected void onSaveInstanceState(Bundle outState) {}( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} ).

Mã ví dụ ...

Lưu trữ bản đồ:

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

Và nhận nó trong onCreate:

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

Xin lỗi nếu đó là một số loại câu trả lời trùng lặp - có thể ai đó sẽ thấy nó hữu ích. :)


4

Nếu bạn muốn gửi tất cả các khóa trong gói, bạn có thể thử

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

Tôi tò mò nếu có lý do gì để không làm điều này? Tôi chưa sử dụng tuần tự hóa nhiều và chưa bao giờ gói (mới đối với android), vì vậy tôi tò mò liệu đây có phải là O (n) và việc thêm vào một gói có hiệu quả là O (1) hay không. Nếu chúng không khác nhau về chi phí, không hiểu tại sao bạn lại bận tâm với việc sắp xếp nó vào một bản đồ khác.
Thuyền trưởng Prinny

@CaptainPrinny trừ khi bản đồ là thứ duy nhất bạn đang ánh xạ đến gói, bạn có thể che khuất các giá trị và bạn sẽ không biết liệu khóa có phải là một phần của bản đồ gốc hay chỉ là một giá trị được lưu trữ trong gói.
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

Tôi đang sử dụng kotlin triển khai Parcelable của mình để đạt được điều đó và cho đến nay nó phù hợp với tôi. Nó rất hữu ích nếu bạn muốn tránh quá nhiều tuần tự hóa.

Ngoài ra, để nó hoạt động, tôi khuyên bạn nên sử dụng nó với những

Tờ khai

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

}

Sử dụng

viết

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

đọc

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

Đừng quên rằng nếu bản đồ của bạn K,Vkhông được phân chia theo mặc định thì chúng phải thực hiệnParcelable


1
Bạn đã thử rút ngắn bằng @Parcelize chưa?
CoolMind

0

Trong Kotlin:

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

putSerializable(ARG_HASH_MAP, hashMap)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.