恢复应用时,Google Maps v2有时会重置

时间:2013-04-22 14:25:50

标签: android google-maps-android-api-2

我在Android应用程序中使用Google Maps v2。一切正常,但是如果我离开应用程序(使用主页按钮),使用该设备进行其他操作然后返回我的应用程序,地图会自行重置并丢弃所有设置和听众。

我认为这是因为我的手机没有那么多内存,所以当它需要它来运行其他应用程序时,对我的应用程序至关重要的东西会丢失...如果我在此期间不使用其他应用程序,那么恢复所有设置和听众完整。

所以我有一个成员变量private GoogleMap map = null;

我需要以编程方式创建地图,因为我将其放入LinearLayoutfragment_wrapper),我也想将其用于其他片段。所以我在onCreate()方法中执行此操作:

mapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.fragment_wrapper, mapFragment);
fragmentTransaction.commit();

地图没有很快初始化,所以我需要在onResume()方法中设置其设置和监听器:

if (map == null) {  
    map = mapFragment.getMap();
    UiSettings settings = map.getUiSettings();
    settings.setMyLocationButtonEnabled(false);
    settings.setZoomControlsEnabled(false);
    (...)
    map.setOnMapClickListener((...));
    (...)
}

我最初将 if 块放在那里,以便应用程序不必在恢复时再次设置地图的设置和监听器。但后来我注意到它忘记了设置。所以我想如果我删除了 if 块,它会再次设置地图,因为在恢复应用程序时会调用onResume()。但它也不起作用......所以所有地图的设置和监听器都消失了,这使得地图变得无用,我的应用程序需要重新启动才能再次设置地图。

有谁能告诉我问题是什么以及如何解决?谢谢。

1 个答案:

答案 0 :(得分:4)

我终于能够在Google Maps v2示例代码中找到解决方案,该代码位于<android-sdk-folder>\extras\google\google_play_services\samples\maps\。见https://developers.google.com/maps/documentation/android/intro#sample_code。帮助我的是文件src\com\example\mapdemo\ProgrammaticDemoActivity.java

发生的事情是应用程序完全关闭,因此再次调用其onCreate()方法。在那里你必须以某种方式找出你是否已经创建了地图片段。解决方案是尝试查找地图片段的标记。如果找不到,则表示活动是第一次运行。您可以创建片段并将标记添加到其中。然后,下次调用onCreate()时,标记可以找到您的片段,并保留所有设置和监听器。

因此,您可以在活动中设置最终的静态变量:private static final String MAP_FRAGMENT_TAG = "map";

然后在onCreate()方法中使用此代码:

mapFragment = (MapFragment) getFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);
if (mapFragment == null) {
    mapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.fragment_wrapper, mapFragment, MAP_FRAGMENT_TAG);
    fragmentTransaction.commit();
}
setUpMapIfNeeded();

这是onResume()方法:

setUpMapIfNeeded();

setUpMapIfNeeded()方法可能如下所示:

if (map == null) {
    map = mapFragment.getMap();
    if (map != null) {
        setUpMap();
    }
}

(因此地图已在onCreate()中设置,如果没有,则在onResume()设置。)

希望这有助于某人。