如何在旋转设备(纵向/横向)后在MapFragment上保留/重新绑定事件监听器?

我正在开发与Xamarin(版本7.1)的Android应用程序。 它显示为地图并绘制PolyLines,在OnCameraIdle()这样做。

MapFragmentOnCreate编程方式生成。 我通过GetMapAsyncOnResume获取GoogleMap ,并在OnMapReady绑定监听OnMapReady
他们工作正常,但只在一开始。 只要设备旋转(纵向 – >横向或反之),相机的移动不会再触发听众。
地图工作,但是 – 我(用户)仍然可以移动相机就好了。 我(应用程序)不能再使用它了。

这是裸码,只有地图的创build和处理。 一切(实际绘图)被删除:

 public class MapActivity : Activity, IOnMapReadyCallback, GoogleMap.IOnCameraIdleListener, GoogleMap.IOnCameraMoveStartedListener { private GoogleMap _map; private MapFragment _mapFragment; private void InitializeMap() { _mapFragment = MapFragment.NewInstance(); var tx = FragmentManager.BeginTransaction(); tx.Add(Resource.Id.map_placeholder, _mapFragment); tx.Commit(); } private void SetMapListeners() { Log.Debug("MyApp/ Map", "SetMapListeners"); _map.SetOnCameraIdleListener(this); _map.SetOnCameraMoveStartedListener(this); } /* Activity */ protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Log.Debug("MyApp / Map", "OnCreate"); SetContentView(Resource.Layout.Map); InitializeMap(); } protected override void OnStart() { base.OnStart(); Log.Debug("MyApp / Map", "OnStart"); } protected override void OnResume() { base.OnResume(); if (_map == null) _mapFragment.GetMapAsync(this); Log.Debug("MyApp / Map", "OnResume"); } protected override void OnPause() { base.OnPause(); Log.Debug("MyApp / Map", "OnPause"); } protected override void OnStop() { base.OnStop(); Log.Debug("MyApp / Map", "OnStop"); } protected override void OnDestroy() { base.OnStop(); Log.Debug("MyApp/ Map", "OnDestroy"); } /* IOnMapReadyCallback */ public void OnMapReady(GoogleMap googleMap) { Log.Debug("MyApp / Map", "Map is ready!"); _map = googleMap; SetMapListeners(); } /* IOnCameraIdleListener */ public void OnCameraIdle() { Log.Debug("MyApp / Map", "Camera is idle."); // Drawing routine is called here } /* IOnCameraMoveStartedListener */ public void OnCameraMoveStarted(int reason) { Log.Debug("MyApp / Map", "Camera move started."); } } 

正如你在下面的日志摘录中看到的那样,监听器在开始时就工作了,但是一旦设备被旋转(至less)一次,它们就消失了。
我也尝试在生命周期中只调用一次SetMapListeners ,第一次OnMapReady ,但是没有任何改变。

 04-03 20:29:06.486 D/MyApp / Map( 7446): OnCreate 04-03 20:29:06.688 I/Google Maps Android API( 7446): Google Play services client version: 10084000 04-03 20:29:06.695 I/Google Maps Android API( 7446): Google Play services package version: 10298438 04-03 20:29:07.394 D/MyApp / Map( 7446): OnStart 04-03 20:29:07.399 D/MyApp / Map( 7446): OnResume 04-03 20:29:07.432 D/MyApp / Map( 7446): Map is ready! 04-03 20:29:07.438 D/MyApp / Map( 7446): SetMapListeners 04-03 20:29:07.568 D/MyApp / Map( 7446): Camera is idle. 04-03 20:29:09.231 D/MyApp / Map( 7446): Camera move started. 04-03 20:29:09.590 D/MyApp / Map( 7446): Camera is idle. 04-03 20:29:12.350 D/MyApp / Map( 7446): Camera move started. 04-03 20:29:12.751 D/MyApp / Map( 7446): Camera is idle. ## Listeners are responding, now rotating the device. 04-03 20:29:15.503 D/MyApp / Map( 7446): OnPause 04-03 20:29:15.508 D/MyApp / Map( 7446): OnStop 04-03 20:29:15.572 D/MyApp / Map( 7446): OnDestroy 04-03 20:29:15.595 I/Google Maps Android API( 7446): Google Play services package version: 10298438 04-03 20:29:15.596 D/MyApp / Map( 7446): OnCreate 04-03 20:29:15.628 I/Google Maps Android API( 7446): Google Play services package version: 10298438 04-03 20:29:15.655 D/MyApp / Map( 7446): OnStart 04-03 20:29:15.655 D/MyApp / Map( 7446): OnResume 04-03 20:29:15.690 D/MyApp / Map( 7446): Map is ready! 04-03 20:29:15.691 D/MyApp / Map( 7446): SetMapListeners ## Map is rotated, camera position was preserved. ## Now moving the camera, but no listeners are responding. 04-03 20:29:24.436 D/MyApp / Map( 7446): OnPause 04-03 20:29:31.288 D/MyApp / Map( 7446): OnStop 04-03 20:29:31.359 D/MyApp / Map( 7446): OnDestroy 

对我来说有趣的是,当我切换回上一个活动,并再次打开地图,它开始新鲜,再次运作。 但是,正如您在日志中看到的那样,在旋转设备的同时,活动也被破坏并新创build。 据我所知,片段不是,所以也许是暗示。 我不知道。

我也尝试删除OnDestroy的侦听器(通过设置null ),但是,也没有改变任何东西。

你有什么想法我可能做错了吗?

Solutions Collecting From Web of "如何在旋转设备(纵向/横向)后在MapFragment上保留/重新绑定事件监听器?"

尝试检查savedInstanceState以查看您的Activity是第一次构build还是只是返回它。 你似乎在每次通话时都会叠加碎片。

尝试将InitializeMap()调用放入OnCreateView()方法的覆盖而不是OnCreate()

默认情况下,当屏幕旋转时,你的Activity被杀死并重新启动。 为了确保没有数据丢失,您需要使用生命周期方法正确保存和恢复您的数据。 请参阅SavingPersistentState或savedInstanceState并遵循此Android开发人员文档希望今年五月可以帮助。

我有类似的问题,因为我们有MapFragment嵌套在另一个片段,所以我们必须每次重新添加MapFragment。 既然你把它直接embedded到一个Activity中,@App Pack也应该可以工作,但是我仍然会粘贴代码。

 @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); //onCreateView() or onResume() should work too FragmentManager fragmentManager = ((AppCompatActivity) getContext()).getSupportFragmentManager(); SupportMapFragment mapFragment = SupportMapFragment.newInstance(); fragmentManager.beginTransaction() .replace(R.id.mapContainer, mapFragment) .commit(); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { this.googleMap = googleMap; UiSettings uiSettings = googleMap.getUiSettings(); uiSettings.setZoomControlsEnabled(false); //do your initialization + recreate your last map position from BundleSavedIntance: check this answer: http://stackoverflow.com/questions/16697891/google-maps-android-api-v2-restoring-map-state/16698624#16698624 } 

而且请: function应该开始小写!