MapFragment 极其缓慢且几乎没有响应

MapFragment extremely slow and barely responding

我目前正在使用 Xamarin.Android 开发 android 应用程序。在此应用程序中,我使用 DrawerLayout(来自支持库 v4)来显示我的应用程序内容和一个菜单,我可以通过按工具栏中的按钮或向右滑动来打开该菜单。

在抽屉的第一部分(页面内容)中,我有一个工具栏替换了经典的操作栏、一个搜索栏和我的 MapFragment。

在菜单部分,我有一个包含线性布局的滚动视图,它本身包含一些元素,如按钮、文本视图等,用户将使用这些元素进行连接或注册。

菜单滑动流畅,每个元素都正确响应,但 mapfragment 显示地图确实有问题。有几秒钟,它显示一个空的网格,我必须点击片段以便加载地图的几个部分。几乎没有控件在响应,有时在等待很长时间后双击会起作用,并且加载更精确的图块将需要很长时间。

显然有什么东西阻止我的地图正确加载,但我不知道它是什么。

这是地图片段:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/mapFragment"
            android:layout_marginTop="94dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.MapFragment" />

下面是我如何将地图加载到 activity 文件(在 OnCreate 函数中):

MapFragment mapFrag = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.mapFragment);
GoogleMap map = mapFrag.Map;
if(map != null)
{
    // The GoogleMap object is ready to go (well, should be)
}

我按照这个创建了我的地图片段:https://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/part_2_-_maps_api/

如果需要,我可以提供更多信息。我完全不知道这是从哪里来的。我在测试应用程序中使用了完全相同的代码(除了它是简单的线性布局,没有抽屉,也没有边距)并且它运行完美,这就是我感到困惑的原因。

编辑:在我编写时让模拟器和我的 phone 运行 应用程序(至少花了我五分钟),但它仍然没有正确响应。在 Genymotion 模拟器 (API 16) 和我的 OnePlus One (API 21) 上测试,结果相同。

提前致谢。

我不确定为什么 "slow",它必须处理和加载地图。

如果您使用的是抽屉布局,这意味着每个页面很可能已经是一个片段。这意味着您将在一个片段中有一个片段。当我在构建时为 MyDriving 示例功能实现此功能时,我使用了标准 MapView widget inside the fragment and if I was in an Activity I used the MapFragment.

如果使用 MapView 小部件,您应该在片段中实施 IOnMapReadyCallback 以获得访问权限:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView(inflater, container, savedInstanceState);
        HasOptionsMenu = true;
        var view = inflater.Inflate(Resource.Layout.fragment_current_trip, null);

        mapView = view.FindViewById<MapView>(Resource.Id.map);
        mapView.OnCreate(savedInstanceState);
        return view;
    }

    public override void OnActivityCreated(Bundle savedInstanceState)
    {
        mapView.GetMapAsync(this);
        base.OnActivityCreated(savedInstanceState);
    }

    GoogleMap map;
    MapView mapView;


    public void OnMapReady(GoogleMap googleMap)
    {
        map = googleMap;
    }

需要注意的是,当您使用 MapView 小部件时,您还必须在使用后进行清理:

  #region MapView Lifecycle Events

    public override void OnResume()
    {
        base.OnResume();
        mapView?.OnResume();
    }

    public override void OnPause()
    {
        base.OnPause();
        mapView?.OnPause();
    }

    public override void OnDestroy()
    {
        base.OnDestroy();
        mapView?.OnDestroy();
    }

    public override void OnSaveInstanceState(Bundle outState)
    {
        base.OnSaveInstanceState(outState);
        mapView?.OnSaveInstanceState(outState);
    }

    public override void OnLowMemory()
    {
        base.OnLowMemory();
        mapView?.OnLowMemory();
    }

    #endregion

如果您在 Activity 中并使用 MapFragment,那么您也应该使用相同的样式,尽管不需要像 MapView 控件那样设置事件:

 GoogleMap map;
 SupportMapFragment mapFrag;

    public async void OnMapReady(GoogleMap googleMap)
    {
        map = googleMap;
    }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
       //Set your layout

        mapFrag = (SupportMapFragment) SupportFragmentManager.FindFragmentById(Resource.Id.map);
        mapFrag.GetMapAsync(this);
    }

希望对您有所帮助