Fehler beim Navigieren von einer Seite mit einer Karte auf Android, während die Bildschirmtastatur sichtbar ist

8

Beim Testen einer Android-Anwendung, die einige Eingabefelder und eine Karte mit aktivierter Geolocation enthält, habe ich festgestellt, dass ich auf die Schaltfläche Zurück bei Android geklickt habe, während die Bildschirmtastatur aktiv war (dh beim Einfügen von Text auf einem der App) würde die App abstürzen und ich würde die folgende Ausnahme auf der Debug-Ausgabe geloggt bekommen:

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.

Ganzer Stack-Trace hier: Ссылка

Einige Dinge zu beachten:

1 - Die in diesen Textfeldern verwendeten Tastaturtypen sind Text und Telefon.

2 - Im Gegensatz zu dem, was der Stack-Trace sagt, verwende ich die Kamera überhaupt nicht auf der Anwendung.

3 - Der MapRenderer wird in Xamarin Forms nicht mit einem solchen Konstruktor ausgeliefert. Wohlgemerkt, ich verwende Xamarin.Forms 1.2.3 (die Pre-Version).

4 - Ich habe versucht, einen benutzerdefinierten Map-Renderer mit einem Dummy-Konstruktor hinzuzufügen, der die erforderlichen Parameter gemäß der Ausnahme akzeptiert hat, ohne Erfolg.

5 - Dies passiert in keiner anderen (getesteten) Situation, nur wenn die Bildschirmtastatur angezeigt wird.

6 - Dies passiert nicht in der iOS-Version.

7 - Die gleichen Schritte wurden auf verschiedenen Geräten (Galaxy Nexus, Galaxy S5, Alcatel One Touch) mit dem gleichen Ergebnis getestet.

    
EfrainReyes 09.09.2014, 15:03
quelle

1 Antwort

4

Ich habe dieses Problem mehrfach in meinem Projekt festgestellt. Was passiert, ist Folgendes:

Die versteckte Seite kann freigegeben werden, während unsere App von Android ausgeführt wird, um Speicher zu sparen. Wenn Sie also auf diese Seite zurückkehren, muss Android sie neu erstellen.

Wenn das passiert, erstellt Mono über den Konstruktor (IntPtr, JniHandleOwnership) eine Instanz des passenden Typs und ruft später den Seitenkonstruktor auf.

Das Problem ist also, dass Sie den Konstruktor "(IntPtr, JniHandleOwnership)" implementieren müssen, damit Mono die Instanz bei Bedarf erstellen kann. Es sieht normalerweise so aus:

%Vor%

John Pryor , der aktuelle Lead von Xamarin Android hat eine ziemlich detaillierte Antwort darüber , die das Verhalten erklärt.

Ich habe bereits den wichtigen Teil seiner Erklärung in diesem Beitrag hervorgehoben.

    
ForceMagic 17.12.2014 15:29
quelle