MapFragment非常慢,几乎没有响应

时间:2016-04-13 14:25:08

标签: android android-layout xamarin google-maps-api-2 mapfragment

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

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

在菜单部分,我有一个包含linearlayout的scrollview,它本身包含一些元素,如按钮,textview等,用户将用它们进行连接或注册。

菜单平滑滑动,每个元素都正确响应,但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" />

以下是我在活动文件中加载地图的方法(在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/

如果需要,我可以提供更多信息。我完全不知道它来自哪里。我在测试应用程序中使用了完全相同的代码(除了它是一个简单的线性布局,没有抽屉,也没有边距)并且它工作得很好,这就是为什么我感到困惑。

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

我不确定为什么它“慢”,它必须处理并加载地图。

如果您使用抽屉布局,这意味着每个页面很可能已经是一个片段。这意味着你将在片段中有一个片段。当我在构建时为MyDriving示例功能实现此功能时,我在片段中使用了一个标准的MapView小部件,如果我在一个Activity中,我使用了MapFragment

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

crop = input('Which crop? ')
quantity = input('How much? ')
file = ('cropdata.txt')           

if crop in open(file).read():
 with open(file, 'r') as file_read:
       lines = []

       for line in file_read:
           if crop in line:
               line = str(line.rstrip("\n") + quantity + " "  + "\n")
           lines.append(line)

 with open(file, 'w') as file_rewrite:
    file_rewrite.writelines(lines)
else:
 print('Crop not found.')

应该注意的是,当您使用MapView小部件时,还必须使用以下内容进行清理:

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;
    }

如果您在Activity中并使用MapFragment,那么您也应该使用相同的样式,尽管不需要像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

我希望这会有所帮助