3

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

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

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

我需要以编程方式创建地图,因为我将它放入我还想用于其他片段的LinearLayout( ) 中。fragment_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()在应用程序恢复时被调用。但它也不起作用......所以所有地图的设置和监听器都消失了,这使得地图无用,我的应用程序需要重新启动才能再次设置地图。

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

4

1 回答 1

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().)

希望这可以帮助某人。

于 2013-04-23T09:57:45.933 回答