Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在HashMap中找不到Google地图的标记_Android_Google Maps_Android Fragments_Google Maps Api 2 - Fatal编程技术网

Android 在HashMap中找不到Google地图的标记

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中找不到标记 我在这里撞到了一堵墙——不明白为什么第一

我创建了一个带有地图片段的简单应用程序。 在OnInfo WindowClick listener的帮助下,用户可以单击标记的信息窗口,并打开另一个带有嵌套片段的活动。我使用HashMap将标记与某个对象链接起来,用相关信息填充第二个活动的片段

当用户第一次单击标记器的信息窗口时,第二个活动启动OK并显示详细信息屏幕。但当用户点击后退按钮并点击这个或其他信息窗口时,应用程序崩溃

我试着调试应用程序,发现在第二次点击信息窗口后,在HashMap中找不到标记

我在这里撞到了一堵墙——不明白为什么第一次在地图上可以找到相同的标记,但第二次却没有

错误:

另外,我已经对代码进行了一些清理,因此堆栈跟踪应该指向第91行而不是第166行

活动代码:

解决 问题在于每次调用onResume时都使用initializeMap方法重新创建标记。每次在与前一个完全相同的位置添加新标记时。我在按旧的记号笔,不知怎么的,它在新的记号笔前面。
在我的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);
  }