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

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)上测试相同的步骤,结果相同.

For*_*gic 4

我在项目中多次遇到这个问题。简而言之,发生的事情是:

当我们的应用程序在 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对此有一个非常详细的答案,解释了这种行为。

实际上我已经在这篇文章中强调了他的解释的重要部分。