在 Xamarin Forms Android 中循环出数组列表时,无法成功获取 KML 文件地标



我一直在使用谷歌地图和kml路线的项目。这个项目几个月前成功运行,但现在当我调试它时,应用程序崩溃并显示以下错误消息:

System.ArgumentNullException

如果我评论离开...

foreach (var data in lineString.ToEnumerable())
{
}

。然后应用程序成功运行,这意味着它无法获取"地标"中的值。

这是代码:

public async void OnMapReady(GoogleMap googleMap)
{
InvokeOnMapReadyBaseClassHack(googleMap);
map = googleMap;
layer = new KmlLayer(map, Resource.Raw.mykmlfile, Android.App.Application.Context); 
}
async void MoveCameraToKmlTwo(KmlLayer kmlLayer)
{
var list = new List<object>();
if (kmlLayer.HasContainers)
{
void IterateProperties(KmlContainer containers)
{
foreach (var property in containers.Properties.ToEnumerable())
{
}
}
void IterateLineString(ArrayList lineString)
{
//when i try to get out the data in here i get the crash
foreach (var data in lineString.ToEnumerable())
{
}
}
void IteratePlaceMarks(KmlContainer container)
{
foreach (KmlPlacemark placemark in container.Placemarks.ToEnumerable())
{
IterateProperties(container);
if (placemark.HasGeometry & placemark.Geometry is KmlLineString)
{
IterateLineString(placemark.Geometry.GeometryJavaObject() as Java.Util.ArrayList);
}
}
}
void IterateSubContainers(KmlContainer container)
{
IterateProperties(container);
IteratePlaceMarks(container);
if (container.HasContainers)
{
foreach (KmlContainer subContainer in container.Containers.ToEnumerable())
IterateSubContainers(subContainer);
}
}
foreach (KmlContainer container in kmlLayer.Containers.ToEnumerable())
IterateSubContainers(container);
}
}

我的 kml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Routes</name>
<description></description>
<visibility>1</visibility>
<open>1</open>
<Style id="dark_green">
<LineStyle>
<color>C8008C14</color>
<width>4</width>
</LineStyle>
</Style>
<Style id="route_dark_blue">
<LineStyle>
<color>96F01414</color>
<width>4</width>
</LineStyle>
</Style>

<Folder>
<name>Tracks</name>
<description>A list of tracks</description>
<visibility>1</visibility>            
<open>0</open>                                      
<Placemark>
<visibility>0</visibility>            
<open>0</open> 
<styleUrl>#red</styleUrl>
<name>Around the lake</name>
<description>Track no. 1</description>
<LineString>
<extrude>true</extrude>
<tessellate>true</tessellate>
<altitudeMode>clampToGround</altitudeMode> 
<coordinates>
7.366653,42.281982,106.075562 7.366759,42.282024,99.504028 7.366846,42.282043,95.945312 7.366909,42.282085,94.900269 7.366982,42.282116,94.186218 7.367039,42.282150,90.530640 7.367124,42.282135,87.749268 7.367111,42.282192,89.794800 7.367088,42.282242,90.636597 7.367079,42.282299,89.214539                             
</coordinates>
</LineString>
</Placemark>                          
</Folder>
</Document>
</kml>

我认为问题是这个演员表

placemark.Geometry.GeometryJavaObject() as Java.Util.ArrayList

相反,您应该使用

placemark.Geometry.GeometryJavaObject().JavaCast<Java.Util.ArrayList>()

也就是说,如果您 100% 确定您得到的回报是ArrayList

您始终可以通过尝试显式强制转换来确定是否需要使用JavaCast<T>()。为什么JavaCast有效而普通演员表不起作用可以在有关JavaCast<T>()的 Xamarin 文档中阅读。简而言之:这是一个黑客...

最新更新