Android - 如何在不同的活动之间传递HashMap<String,String>?

50

如何将detail哈希表传递给另一个Activity?

HashMap<String,String> detail = new HashMap<String, String>();
detail.add("name","paresh");
detail.add("surname","mayani");
detail.add("phone","99999");
......
......

将HashMap的值作为WeakReference,以在活动之间传递数据。或者将你的HashMap设置为public和static,在调用活动中设置其值,并在被调用活动中使用其值。在向HashMap添加值之前,请清除其先前的值。 - Pankaj Kumar
@Tanmay请不要更改原始贴主的代码。请添加一条评论或答案,概述所做的更改。(被拒绝的编辑) - Pekka
你能否将你的hashMap设置为public static吗?我可以解释一下。 - Pankaj Kumar
@PM- Paresh Mayani:这可能对你有帮助:https://dev59.com/WnE85IYBdhLWcg3wLAUV 我没有找到任何直接的方法来做到这一点,除了创建static HashMap - Vikas Patidar
@PM Paresh Mayani:根据您的问题,我真的不认为您需要传递HashMap,而是可以通过在意图中放置一个ArrayList<String>来实现此目的,在另一个活动中,您可以获取这些位置的值,假设您知道存储在特定位置的数据。 - Vikas Patidar
显示剩余3条评论
5个回答

75

这很简单,所有的Collections对象都实现了Serializable接口,这意味着它们可以作为Extras在Intent中传递。

使用putExtra(String key, Serializable obj)HashMap插入,然后在另一个Activity中使用getIntent().getSerializableExtra(String key)。不过,您需要将返回值强制转换为HashMap


1
请问,如果我有一个HashMap<String,Object>怎么办?它可以被序列化吗?值对象只是int,String或float类型。没有自定义对象类型。 - Yeung
请注意,该映射不会被序列化。如果可能的话,它将被内部打包。然后,在另一端,您将获得一个HashMap,而不管您放置了LinkedHashMap或任何其他映射。 - Miha_x64
你需要将返回值进行强制转换,这就是我所遗漏的。 - arlomedia
我收到了“未经检查的转换”警告。 - temirbek
“Unchecked cast” 警告基本上是在说:“你必须自行承担风险” ;) - Aba

67

解决方案:

发送者活动:

HashMap<String, String> hashMap= adapter.getItem(position);
Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);
intent.putExtra("hashMap", hashMap);
startActivity(intent);

接收器活动:

Intent intent = getIntent();    
HashMap<String, String> hashMap = (HashMap<String, String>) intent.getSerializableExtra("hashMap");

嗨,你好,我在运行时遇到了包错误。java.lang.RuntimeException: Parcel: unable to marshal value 我正在传递 HaspMap<String, JSONArray>。 - Anish Kumar
@anish 因为JSONArray不可序列化。 - Abubakar
感谢您的帮助,朋友。虽然回复有点晚,但我很感激。:) @Abubakar - Anish Kumar

4
我用这个来传递我的HashMap。
startActivity(new Intent(currentClass.this,toOpenClass.class).putExtra("hashMapKey", HashMapVariable));

在接收活动中编写以下内容:

HashMap<String,String> hm = (HashMap<String,String>) getIntent().getExtras().get("hashMapKey");

因为我知道我的哈希映射包含字符串作为值。

你确定能够使用 getExtras.get("key") 获取 HashMap<String, String> 吗? - Paresh Mayani
是的...只要您将“HashMap<String,String>”传递给接收活动 - user3721482

1
一个替代方案是,如果信息可能被认为是应用程序的“全局”信息,则可以使用Application类。您只需扩展它,然后在清单中使用<application>标记定义自定义类。不过要谨慎使用,因为滥用它的冲动很高。

谢谢您的支持和提供的“新”信息,但我只需要在两个活动之间传递HashMap,即从A活动到B活动。 - Paresh Mayani
1
我明白了。只是想提供它作为另一种选择。 - MattC

0

这里我展示了一段代码供您参考。我刚刚尝试了这段代码,它对我来说运行良好。请查看:

MainActivity:

    final HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
    hashMap.put(1, "Hi");

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub              

            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("h", hashMap);
            startActivity(intent);

        }
    });

SecondActivity:

Toast.makeText(SecondActivity.this,"Hi " +  getIntent().getSerializableExtra("h").toString(),Toast.LENGTH_SHORT).show();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接