Efr*_*yes 8 android xamarin.android xamarin 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)上测试相同的步骤,结果相同.
我在项目中多次遇到这个问题。简而言之,发生的事情是:
当我们的应用程序在 Android 上运行时,可以释放隐藏页面以节省内存。因此,当您返回该页面时,Android 需要重新创建它。
当发生这种情况时,Mono 将通过构造函数创建适当类型的实例(IntPtr, JniHandleOwnership),然后它将调用页面构造函数。
所以问题是你需要实现“(IntPtr, JniHandleOwnership)构造函数”,以便Mono可以在需要时创建实例。它通常看起来像这样:
public YourClassName(IntPtr javaReference, JniHandleOwnership jniHandleOwnership)
: base(javaReference, jniHandleOwnership) { }
Run Code Online (Sandbox Code Playgroud)
Xamarin Android 的现任负责人John Pryor对此有一个非常详细的答案,解释了这种行为。
实际上我已经在这篇文章中强调了他的解释的重要部分。
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |