我正在使用Xamarin(版本7.1)开发一款Android应用程序。它显示为地图,并在OnCameraIdle()
中绘制PolyLines。
MapFragment
在OnCreate
中以编程方式生成。我通过GetMapAsync
在OnResume
中获取GoogleMap
并在OnMapReady
中绑定侦听器。
它们很好用,但只有在一开始的时候。一旦设备旋转(纵向->横向或反之亦然),摄像机移动就不再触发侦听器了。
地图仍然可以工作-用户仍然可以很好地移动摄像机。我(应用程序)只是不能再使用它了。
以下是裸代码,只包括地图创建和处理。所有其他内容(实际绘图)都被删除:
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.");
}
}
通过以下日志摘录可以看到,监听器在开始时确实起作用,但一旦设备旋转(至少)一次,它们就消失了。
我还尝试仅在生命周期中的第一次调用OnMapReady
时调用SetMapListeners
,但这并没有改变任何内容。
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
对我来说,有趣的是当我切换回先前的活动并再次打开地图时,它会重新开始工作。但是,如您在日志中所见,在旋转设备时,该活动也被销毁并重新创建。据我所知,碎片不是这样,所以也许那是个提示。我不知道。
我还尝试在OnDestroy
中删除侦听器(通过设置null
),但这也没有改变任何东西。
您有什么想法,我可能做错了什么吗?
savedInstanceState
以查看您的Activity是否是第一次构建还是仅返回它。您似乎在每次调用时重叠了片段。 - gustavogbcConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize
,现在它可以正常工作了。尽管检查savedInstanceState
(仅在其为null
时创建MapFragment
)没有帮助。请将此发布为答案,以便我可以授予您赏金。 - Imanuel