【问题标题】:Cannot access my map out of the OnMapReady method无法通过 OnMapReady 方法访问我的地图
【发布时间】:2019-06-01 03:27:52
【问题描述】:

我以前从未在 Xamarin 中做过任何事情,在 Android 中也很少。我确实知道 C、C++ 和一些 C#。

这不是 Xamarin 表单。

我已经搜索了一段时间,但什么也没找到。更令人沮丧的是,我发现人们可以通过其他方法简单地访问他们的谷歌地图,而我却不能。

在这里,我当然可以访问我的地图。这兴趣有限,因为我想在初始化后对其进行交互。

public void OnMapReady(GoogleMap googleMap)
    {
        locationManager = GetSystemService(LocationService) as LocationManager;
        MapStyleOptions style;
        string styleString;
        using (StreamReader sr = new StreamReader(Assets.Open("map_style.json")))
            styleString = sr.ReadToEnd();
        style = new MapStyleOptions(styleString);
        googleMap.UiSettings.ZoomControlsEnabled = false;
        googleMap.UiSettings.CompassEnabled = false;
        googleMap.UiSettings.RotateGesturesEnabled = false;
        googleMap.UiSettings.TiltGesturesEnabled = false;
        googleMap.UiSettings.MyLocationButtonEnabled = false;
        googleMap.UiSettings.ZoomGesturesEnabled = false;
        googleMap.UiSettings.ScrollGesturesEnabled = false;
        googleMap.UiSettings.MapToolbarEnabled = false;
        googleMap.SetMapStyle(style);
        LatLng coords = new LatLng(lat, longi);
        CameraUpdate pos = CameraUpdateFactory.NewCameraPosition(new CameraPosition(coords, 19, 50, 0));
        googleMap.MoveCamera(pos);
        GMap = googleMap;
    }

在这里,我尝试通过任何可能的方式访问我的地图。注释的东西不起作用,我还尝试声明我稍后将在 OnMapReady 中分配给 googlemap 的指针,这是不允许的。

    public void OnLocationChanged(Location location)
    {
        lat = location.Latitude;
        longi = location.Longitude;
        LatLng coords = new LatLng(lat, longi);
        CameraUpdate pos = CameraUpdateFactory.NewCameraPosition(new CameraPosition(coords, 19, 50, 0));
        //googleMap.MoveCamera(pos); 
        //FragmentManager.FindFragmentById<MapFragment>(Resource.Id.googlemap).???
    }

我看到人们只是从任何地方访问他们的谷歌地图。 以上所有代码均来自我的主要活动。

我不知道它是否重要,但这是整个 axml 文件。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment  
        android:id="@+id/googlemap"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        class="com.google.android.gms.maps.MapFragment" />  
</RelativeLayout>

所以大的想法是,我只想移动地图,每当位置发生变化时,通过在 OnLocationchanged 中执行类似

googleMap.MoveCamera(pos);

提前致谢。

【问题讨论】:

    标签: c# android google-maps xamarin geolocation


    【解决方案1】:

    您将 GoogleMap 实例存储在一个名为 GMap 的变量中,该变量位于您的 OnMapReady 末尾。

    所以在您的OnLocationChanged 中使用该实例:

    GMap?.MoveCamera(pos); 
    

    【讨论】:

    • 哦,我也这样做了。它也没有用。因为我认为这是链接到...片段或其他什么的其他谷歌地图?我对 Xamarin 或 Android 都不是很了解。无论哪种方式,使用 GMap 都行不通。
    • @Tohkai ..didn't work.... 什么不起作用?是否为空,不移动相机等...?异常/堆栈跟踪/...?
    • 没关系,你是对的,我猜 GMap /is/ 实际上是对实际地图的引用。我尝试在 OnMapReady 中执行 GMap.MoveCamera(pos) 并且它有效,因此,问题不是来自地图,而是我的“OnLocationChanged”方法没有被调用。看来我得看看这个了……
    • 别介意。正如我所说,这可能是在退出 OnMapReady 范围时丢失的副本。每当从外部调用 moveCamera 方法时,它就不起作用。如,当 moveCamera 被调用时,它永远不会处理,线程永远不会到达它之后的行。但是它在 OnMapReady 中有效。所以我相信我问的问题是正确的——我如何从这些方法之外影响我的地图?
    • @Tohkai 假设您有一个有效的 GoogleMap 实例,请确保您在 UI/主线程 (RunOnUiThread) 上调用 MoveCamera
    【解决方案2】:

    moveCamera 只能在主线程上调用。

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2017-11-20
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多