バンドルのAndroid HashMap?


90

android.os.Message使用するBundleことののsendMessage-方法で送信します。したがって、HashMap内部に置くことは可能Bundleですか?


javaとandroid初心者8)すべての人にthnx!
マーカステッパー

問題が解決した場合は、すべての回答を受け入れます。thx
AMerle


回答:


164

次のように試してください:

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

そして2番目の活動で

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

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

なぜならHashMapの デフォルト実装によってSerializableは、使用してそれを渡すことができますので、putSerializableバンドルにし、使用している他の活動に入りますgetSerializable


リンクされたハッシュマップパーセルをシリアル化しようとすると、エラーが発生します。値com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98をマーシャリングできません
11:48のSweetWisherツオクト

1
このメソッドをプリミティブデータタイプと別のオブジェクトの配列リストを含むオブジェクトに使用できますか?
SweetWisherツオクト

3
問題がある場合は、マップではなくHashMapを使用していることを確認してください
Matthew

1
次の方法(HashMap <String、Integer>)で、返されたシリアル化可能なオブジェクトをハッシュマップにキャストしたい場合があります
cammando

3
これにより、チェックされていないキャストに関する警告が生成されます。これは無視しても安全ですか?
mitsest 2017年


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)であるかどうかに興味があります。コストが変わらない場合は、なぜそれを別のマップにシリアル化するのが面倒なのかわかりません。
プリニー船長、2016

@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

コトリンでは:

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.