在测试包含几个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)上测试了相同的步骤,结果相同。
答案 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。