导航离开带有Android地图的页面时出错,而屏幕键盘可见

时间:2014-09-09 15:03:36

标签: android xamarin xamarin.android xamarin.forms

在测试包含几个Entry文本框和启用了地理位置的地图的Android应用程序时,我发现如果我在屏幕键盘启动时单击Android上的后退按钮(即,在一个上插入文本时) (条目),应用程序会崩溃,我会在调试输出上记录以下异常:

09-09 00:10:38.187 I/MonoDroid(14174): UNHANDLED EXCEPTION: System.NotSupportedException: Unable to activate instance of type Xamarin.Forms.Maps.Android.MapRenderer from native handle b250001d ---> System.MissingMethodException: No constructor found for Xamarin.Forms.Maps.Android.MapRenderer::.ctor(System.IntPtr, Android.Runtime.JniHandleOwnership) ---> Java.Interop.JavaLocationException: Exception of type 'Java.Interop.JavaLocationException' was thrown.

此处的整个堆栈跟踪:http://pastebin.com/hDAS4JLV

要记住的一些事情:

1 - 这些文本框上使用的键盘类型是文本和电话。

2 - 与堆栈跟踪所说的相反,我在应用程序上根本没有使用相机。

3 - MapRenderer在Xamarin Forms上没有这样的构造函数。请注意,我使用的是Xamarin.Forms 1.2.3(-Pre版本)。

4 - 我尝试添加一个带有虚拟构造函数的自定义地图渲染器,根据异常接受所需的参数,但无济于事。

5 - 只有在显示屏幕键盘时,才会发生任何其他(测试)情况。

6 - 这在iOS版本中不会发生。

7 - 在几个设备(Galaxy Nexus,Galaxy S5,Alcatel One Touch)上测试了相同的步骤,结果相同。

1 个答案:

答案 0 :(得分:4)

我在项目中遇到了这个问题的倍数。总结的是:

我们的应用程序由Android运行时可以释放隐藏页面以节省内存。因此,当您返回该页面时,Android需要重新创建它。

当发生这种情况时,Mono将通过(IntPtr, JniHandleOwnership)构造函数创建相应类型的实例,稍后它将调用页面构造函数。

所以问题是你需要实现“(IntPtr,JniHandleOwnership)构造函数”,以便Mono可以在需要时创建实例。通常看起来像这样:

public YourClassName(IntPtr javaReference, JniHandleOwnership jniHandleOwnership) 
    : base(javaReference, jniHandleOwnership) { }

John Pryor,Xamarin Android的当前主管a pretty detailed answer about it解释了这种行为。

我实际上已经强调了他的解释的重要部分in this post