번들의 Android HashMap?


90

android.os.Message사용 Bundle그것의 sendMessage 첨부 메소드와 함께 보낼 수 있습니다. 따라서 HashMap내부에 Bundle?


자바와 안드로이드 초보자 8) 모두에게 thnx!
Marcus Toepper 2012

문제가 해결 되었으면 아무 대답이나 수락하십시오. THX
AMerle


답변:


164

다음과 같이 시도하십시오.

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

두 번째 활동에서

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

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

때문에 해시 맵 기본 구현으로 Serializable는 사용하여 전달할 수 있도록 putSerializable번들 및 사용하여 다른 활동에서 얻을getSerializable


연결된 해시 맵 Parcel을 직렬화하려고 할 때 오류가 발생합니다 : com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ

1
기본 데이터 유형과 다른 객체의 배열 목록을 포함하는 객체에이 방법을 사용할 수 있습니까 ??
SweetWisherツ

3
문제가있는 경우 Map이 아닌 HashMap을 사용하고 있는지 확인하십시오
Matthew

1
반환 된 직렬화 가능 객체를 다음과 같은 방법으로 해시 맵으로 캐스팅 할 수 있습니다 (HashMap <String, Integer>)
cammando

3
이것은 확인되지 않은 캐스트에 대한 경고를 생성합니다. 무시해도 안전합니까?
mitsest

12

에 따르면 문서 , 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));
}

안 할 이유가 있을까? 직렬화를 많이 사용하지 않았고 번들 (안드로이드의 새로운 기능)을 사용하지 않았기 때문에 이것이 O (n)이고 번들에 추가하는 것이 사실상 O (1)인지 궁금합니다. 비용이 다르지 않다면 다른 맵으로 직렬화하는 데 왜 신경을 쓰지 않는지 알 수 없습니다.
Captain Prinny

@CaptainPrinny 맵이 번들에 매핑하는 유일한 것이 아니라면 값을 방해 할 수 있으며 키가 원래 맵의 일부인지 아니면 번들에 저장된 값인지 알 수 없습니다.
제이슨

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

나는 그것을 달성하기 위해 Parcelable의 kotlin 구현을 사용하고 있으며 지금까지 나를 위해 작동합니다. 무거운 직렬화를 피하려는 경우 유용합니다.

또한 작동하려면 다음 과 함께 사용하는 것이 좋습니다.

선언

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

0

Kotlin에서 :

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

putSerializable(ARG_HASH_MAP, hashMap)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.