2017-01-20 1 views
7

Ich bin der Konstruktor Schwierigkeiten in Xamarin Android bewusst wie hier erklärt: No constructor found for ... (System.IntPtr, Android.Runtime.JniHandleOwnership)Wird Xamarin Android OnCreateView ausführen, wenn der IntPtr-Konstruktor aufgerufen wird?

und alle Fragmente & Aktivitäten & andere benutzerdefinierte Ansichten, die ich diesen Konstruktor in der App Import erstellen.

Manchmal wird jedoch eine null reference exception in der OnCreateView Methode geworfen. Beispiel:

public class TestView: Android.Support.V4.App.Fragment{ 

    public TestClass _testClass; 

    public TestView (TestClass testClass) 
    { 
     this._testClass = testClass; 
    } 

    public TestView(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) 
    { 
    } 

    public override Android.Views.View OnCreateView (Android.Views.LayoutInflater inflater, Android.Views.ViewGroup container, Android.OS.Bundle savedInstanceState) 
    { 
     View view = inflater.Inflate (Resource.Layout.Fragment_TestView, container, false); 

     _testClass.ExecuteTestMethod(); 

     return view; 
    } 

} 

Dieses Stück Code wirft ein null reference exception im OnCreateView, occassionaly. Das passiert sehr selten und niemals, wenn ich die Ansicht direkt aus dem Code erstelle und dann teste.

Jetzt ist eindeutig der einzige Punkt in diesem Code, wo die Ausnahme ausgelöst werden kann, auf der _testClass Variable. So jetzt offensichtlich meine Frage ist, ist die OncreateView Methode auch ausgeführt, wenn der javaReference Konstruktor aufgerufen wird?

Antwort

3

Auch in Java onCreateView kann in Situationen genannt werden, in denen der Konstruktor wäre nicht, das ist das Fragment Lebenszyklus funktioniert:

Fragment Lifecycle Diagram


Ihr Konstruktor vor Fragment hinzugefügt wird aufgerufen, aber die Instanz Variable _testClass wird nicht immer festgelegt, da Android beim Wiederherstellen den Standard Konstruktor aufruft. Ich würde vermuten, dass Ihre Abstürze passieren, wenn Sie das Gerät drehen (dreimal in Folge?) Und/oder, wenn Sie in einer anderen App gehen und komme zurück

Sie müssen verwalten, dass durch die Argumente persistierenden (Basisdatentypen von Bundle unterstützt) benötigten eine Instanz von TestClass mit onSaveInstanceState zu schaffen, indem sie dann eine Instanz von TestClass in onResume

+0

Hey, danke für Ihre Antwort zu erstellen! Die Rotation ist in unserer App gesperrt, so dass die Wiederherstellung nicht stattfindet, aber wie Sie darauf hinweisen, wird es höchstwahrscheinlich auftreten, wenn die App aus dem Ruhezustand oder aus einer anderen App kommt. Ich werde diesen Hinweis in unserer aktuellen App untersuchen und werde zu Ihnen zurückkommen! Vielen Dank! –

+0

@PhilippeCreytens gibt es mehrere Ereignisse außer Rotation, die Konfigurationsänderungen verursachen (wie das Verbinden einer Tastatur, Ändern der Systemsprache, etc.), Sie können sie deaktivieren, aber dann brechen Sie Unterstützung für die Dinge, die diese Änderungen verursachen. (versehentlich eingeben) Sie können durch Sperren Rotation unterstützt ordnungsgemäßen Zustand Restauration versuchen und überspringen, aber es ist eine schlechte Arbeit um das bricht, wenn die Menschen außerhalb eines Vakuums Ihre App verwenden und ist in der Regel nicht nachhaltig. Je früher Sie damit beginnen, desto weniger Trauer erleben Sie auf der Straße. –

+0

Ich erzähle dich völlig von dir, aber die App, über die ich gerade spreche, ist nur Portrait, deshalb ist die Rotation in der App nicht verfügbar. Nicht wegen dieser Probleme. –

Verwandte Themen