【问题标题】:Xamarin Forms Map Android CustomRenderer MoveToRegion Not Working After Upgrading To API25Xamarin Forms Map Android CustomRenderer MoveToRegion 在升级到 API25 后不工作
【发布时间】:2017-06-13 02:00:13
【问题描述】:

我刚刚将我的应用程序升级到 Android 7.1(API25) 并更新 NuGet 包,如下所述:

Xamarin.GooglePlayServive.Maps to v42.1021.1
Xamarin.Forms to v2.3.4.247
Xamarin.Forms.Maps to v2.3.4.247
Xamarin.Android.Support.V4 to v25.3.1
Xamarin.Android.Support.V7.* to v25.3.1

我受益于从 Map 类和 android CustomRenderer 派生的 CustomMap 类。之前一切正常,但更新后,MoveToRegion() 方法没有做任何事情,甚至 map 也没有在我传递给 ctor 的初始 MapSpan 处初始化。

我找不到原因。 请给我任何可能的原因。我会尽一切努力解决这个 FORCE MAJOR 问题!

【问题讨论】:

  • 是否可以分享一个演示问题的示例项目?
  • 这不是一个已知的错误,我认为它有一个 bugzilla 报告,在评论中有一个临时补丁的链接。如果我有时间,我会尝试找到它。
  • @Digitalsa1nt 你找到什么了吗?我没有。
  • @Hosein 是的,抱歉,这是指向错误 bugzilla.xamarin.com/show_bug.cgi?id=52625 的链接,您可以从 Nuget 获得的插件称为 Xamarin.Forms.Maps.Android.TemporaryPatch - 值得一看它符合您的问题。
  • @Digitalsa1nt 谢谢,但这不是我的问题。我遇到了这个问题并禁用了链接,现在已经解决了。 nuget 也未被其所有者列出。

标签: android google-maps xamarin xamarin.android xamarin.forms


【解决方案1】:

我现在找到了解决此问题的方法。 https://forums.xamarin.com/discussion/comment/264930/#Comment_264930

看来我的 CustomMapRenderer 类 (Xamarin.Forms.Maps.Android.MapRenderer) 的基类有一个实现 IOnMapReadyCallback 的方法,名为 OnMapReady,它不会被调用。我所要做的就是实现 IOnMapReadyCallback 并添加一个调用 InvokeOnMapReadyBaseClassHack 的方法 OnMapReady(调用基类 OnMapReady):

public void OnMapReady(GoogleMap googleMap)
{
    ...

    InvokeOnMapReadyBaseClassHack(googleMap);
}

private void InvokeOnMapReadyBaseClassHack(GoogleMap googleMap)
{
    System.Reflection.MethodInfo onMapReadyMethodInfo = null;

    Type baseType = typeof(MapRenderer);
    foreach (var currentMethod in baseType.GetMethods(System.Reflection.BindingFlags.NonPublic |
                                                        System.Reflection.BindingFlags.Instance |
                                                        System.Reflection.BindingFlags.DeclaredOnly))
    {

        if (currentMethod.IsFinal && currentMethod.IsPrivate)
        {
            if (string.Equals(currentMethod.Name, "OnMapReady", StringComparison.Ordinal))
            {
                onMapReadyMethodInfo = currentMethod;

                break;
            }

            if (currentMethod.Name.EndsWith(".OnMapReady", StringComparison.Ordinal))
            {
                onMapReadyMethodInfo = currentMethod;

                break;
            }
        }
    }

    if (onMapReadyMethodInfo != null)
    {
        onMapReadyMethodInfo.Invoke(this, new[] { googleMap });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2016-03-01
    • 2017-09-15
    • 2016-09-27
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多