Android 在HashMap中找不到Google地图的标记
我创建了一个带有地图片段的简单应用程序。 在OnInfo WindowClick listener的帮助下,用户可以单击标记的信息窗口,并打开另一个带有嵌套片段的活动。我使用HashMap将标记与某个对象链接起来,用相关信息填充第二个活动的片段 当用户第一次单击标记器的信息窗口时,第二个活动启动OK并显示详细信息屏幕。但当用户点击后退按钮并点击这个或其他信息窗口时,应用程序崩溃 我试着调试应用程序,发现在第二次点击信息窗口后,在HashMap中找不到标记 我在这里撞到了一堵墙——不明白为什么第一次在地图上可以找到相同的标记,但第二次却没有 错误: 另外,我已经对代码进行了一些清理,因此堆栈跟踪应该指向第91行而不是第166行 活动代码: 解决 问题在于每次调用onResume时都使用initializeMap方法重新创建标记。每次在与前一个完全相同的位置添加新标记时。我在按旧的记号笔,不知怎么的,它在新的记号笔前面。Android 在HashMap中找不到Google地图的标记,android,google-maps,android-fragments,google-maps-api-2,Android,Google Maps,Android Fragments,Google Maps Api 2,我创建了一个带有地图片段的简单应用程序。 在OnInfo WindowClick listener的帮助下,用户可以单击标记的信息窗口,并打开另一个带有嵌套片段的活动。我使用HashMap将标记与某个对象链接起来,用相关信息填充第二个活动的片段 当用户第一次单击标记器的信息窗口时,第二个活动启动OK并显示详细信息屏幕。但当用户点击后退按钮并点击这个或其他信息窗口时,应用程序崩溃 我试着调试应用程序,发现在第二次点击信息窗口后,在HashMap中找不到标记 我在这里撞到了一堵墙——不明白为什么第一
在我的HashMap中存储了实际的标记,但当我点击一个旧的应用程序时崩溃了。通过添加mMap.clear调用来删除我的initializeMap方法中的所有旧标记,解决了此问题。新活动启动后,您的MapActivity将被销毁,因此,当您返回MapActivity时,所有arraylist和hashmap都是空的,您可以将调试器放在OnCreate方法上,您可以看到正在调用OnCreate方法。要在再次创建MapActivity时为其保存数据,您需要通过实现OnSaveInstanceState方法将数据保存在捆绑包中,并保存数据,然后使用OnCreate方法从捆绑包中检索数据。保存简单数据类型(如字符串、整数等)的ArrayList很容易。但对于对象(如Dog),需要实现Parcelable才能保存Dog对象的数组,然后重新创建标记 首先,Dog对象需要实现Parcelable
public class Dog implements Parcelable{
这是一个很好的帖子,它有一个很好的例子来实现Parcelable,
然后您需要将OnCreate方法更改为如下所示
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState!=null)
{
mDogList = savedInstanceState.getParcelableArrayList("My Dogs");
addingMarkers();
}
此外,还需要实现onSaveInstanceState来保存狗对象列表
@Override
protected void onSaveInstanceState(Bundle bundle)
{
super.onSaveInstanceState(bundle);
bundle.putParcelableArrayList(mDogList);
}
我希望这对你有用。我有保存多个字符串数组列表而不是对象的逻辑,但这里的关键是实现Parcelable并在onCreate方法中重建HashMap。感谢您的帮助!我试着朝你指的方向看。但事实上,在我的例子中,onCreate只有在应用程序启动时才被调用。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState!=null)
{
mDogList = savedInstanceState.getParcelableArrayList("My Dogs");
addingMarkers();
}
@Override
protected void onSaveInstanceState(Bundle bundle)
{
super.onSaveInstanceState(bundle);
bundle.putParcelableArrayList(mDogList);
}