我目前正在使用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)上测试,结果相同。
提前致谢。
答案 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
我希望这会有所帮助