- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Xamarin(7.1 版)开发 Android 应用程序。它显示为 map 并绘制折线,在 OnCameraIdle()
中执行此操作。
MapFragment
是在 OnCreate
中以编程方式生成的。我正在通过 GetMapAsync
在 OnResume
中获取 GoogleMap
并在 OnMapReady
中绑定(bind)监听器。
他们工作得很好,但只是在开始阶段。一旦设备旋转(纵向 -> 横向,反之亦然),相机移动就不会再触发听众。
然而, map 有效 - 我(用户)仍然可以很好地移动相机。我(应用程序)无法再使用它了。
这是裸代码,只有 map 创建和处理。其他所有内容(实际绘图)均已删除:
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.");
}
}
正如您在以下日志摘录中所见,监听器在开始时确实起作用,但是一旦设备旋转(至少)一次,它们就消失了。
我还尝试在生命周期中仅调用一次 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
对我来说有趣的是,当我切换回之前的 Activity 并再次打开 map 时,它会重新开始并再次运行。但是,正如您在日志中看到的那样,在旋转设备时, Activity 也会被销毁并重新创建。据我所知, fragment 不是,所以这可能是暗示。我不知道。
我还尝试删除 OnDestroy
中的监听器(通过设置 null
),但这也没有改变任何东西。
你知道我可能做错了什么吗?
最佳答案
尝试将 InitializeMap() 调用置于 OnCreateView() 方法的重写中而不是 OnCreate()
关于c# - 旋转设备(纵向/横向)后如何在 MapFragment 上保留/重新绑定(bind)事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43192685/
我想制作一个使用 Google Maps for Android v2 的 Android 应用程序。 我可以显示一张 map 。我什至可以导航和缩放。但是,当我想搜索要进行的更多操作时,我找不到任何
我正在按照本教程制作抽屉导航: https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer 我的 fragme
我一直在Navigation Drawer Activity 中工作,它有很多 fragment ,其中一个 fragment 包含MapFragment。 现在 MapFragment 中出现问题,
我的应用程序中有一个 MapFragment 和常规 fragment 。问题是当我在 fragment 之间切换时,MapFragment 在后台。我有代码来查找 MapFragment 是否存在,
我遇到了以下错误 Skipped 40 frames! The application may be doing too much work on its main thread. 对此进行了研究.
我有一个包含 MapFragment 的 View 我的 mainViewPanel 看起来像这样 我的翻译代码是这样的 TranslateAnimation anim = new Transl
我想知道实现带抽屉导航的 MapFragment 的正确方法是什么。我已经可以很好地工作了,但我一直在阅读一些文档,也许它会在未来造成麻烦。 所以,我实现了抽屉导航的主类是一个非常普通的类,具有以下
将 MapFragment 与操作栏菜单一起使用时,我遇到了性能问题。 当满足三个条件时就会出现错误 实例化一个 MapFragment。 从选项菜单触发 fragment 事务,用另一个 fragm
我正在尝试构建一个将实现操作栏选项卡的应用程序。其中一个选项卡应包含一个 MapFragment。 如何实现带有选项卡的操作栏,其中一个选项卡下方是 map fragment ? 你能帮我解决这个问题
我正在使用 MapFragment,我的 Activity 布局是这样的: 如果我想使用 CameraUpdateFactory.newLatLngBounds(LatLngBounds, padd
我正在尝试将我的 ActionBar 迁移到 AppCompat 21 方式(使用设置为用作 ActionBar 的工具栏小部件),但它没有显示或被 MapFragment 隐藏。 这是我的 Acti
我有一个位置类,它在 MapFragment 上创建一个实例,并且根据创建 map 的 Activity ,将放置不同的标记。我还希望 map 显示手机当前位置的标记。 我假设我可以做这样的事情,但我
我正在尝试使我的 map 应用程序重定向到位置权限设置,一旦授予权限,就会再次重定向到应用程序。由于某种原因,我的 onActivityResult 在启动 Activity Intent 后甚至没有
我目前正在调整 Google Map MapFragment View 的大小(从全屏高度到半屏)。我使用 ValueAnimator 来实现此目的,但动画在设备 (Nexus 6p) 上似乎滞后。我
我有一个使用 Google map fragment 的应用程序,我想以某种方式设置用户可以使用 map fragment 中提供的 +/- 图标达到的缩放级别限制。 有什么已知的方法可以做到这一点吗
有没有什么方法可以在不使用 XML 的情况下以编程方式将 Button 添加到 MapFragment 或直接添加到 GoogleMap 对象? 谢谢! 最佳答案 当然有,当然不是直接到 map fr
我有一个 Activity 和 MapFragment 类。我在 Activity 中创建了 MapFragment 对象。当我尝试获取 mapFragmentObject.getView() 时,它
我正在尝试在 Android Studio 中显示来自 ArcGis 的 MapView。为此,我正在使用 Map Fragments,我将 Map 和其他 UI 内容放入 xml 中。将 MapVi
我正在尝试在 PagerAdapter 中加载 Mapfragment。这是适配器代码, public class ShopPagerAdapter extends PagerAdapter {
我查看了文档,但找不到 MapFragment 只显示左下角带有 Google Logo 的灰色屏幕的任何原因。在我的 list 中,我有应用程序级别的适当元数据(GMS 版本号和 api key )
我是一名优秀的程序员,十分优秀!