Xamarin表单映射Android CustomRenderer MoveToRegion升级到API25后不起作用

时间:2017-06-13 02:00:13

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

我刚刚将我的应用程序升级到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类的CustomMap类和一个android CustomRenderer中受益。之前一切运行良好,但是在更新之后,方法MoveToRegion()没有做任何事情,甚至map也没有在我传递给ctor的初始MapSpan中初始化。

我找不到原因。 请告诉我任何可能的原因。我会尝试任何解决这个FORCE MAJOR问题的事情!

1 个答案:

答案 0 :(得分:1)

我现在找到了克服这个问题的黑客攻击。 https://forums.xamarin.com/discussion/comment/264930/#Comment_264930

我的CustomMapRenderer类(Xamarin.Forms.Maps.Android.MapRenderer)的基类似乎有一个实现名为OnMapReady的IOnMapReadyCallback的方法,该方法不会被调用。我所要做的就是实现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 });
    }
}