9

Ich entwickle gerade eine Anwendung mit Xamarin.Forms, die auf den Android- und iOS-Plattformen verfügbar sein wird. Wenn die Anwendung zum ersten Mal auf das Gerät geladen wird, überprüfe ich, ob auf dem Gerät eine Internetverbindung verfügbar ist. Ich möchte ein Dialogfeld anzeigen, wenn eine Internetverbindung nicht verfügbar ist.Aktuelle Aktivität von Application.Context erhalten - MonoAndroid

Hier ist der folgende Code-Snippet Ich bin mit dem Internet auf den Xamarin.Forms.ContentPage

if(App.Connectivity.IsNetworkConnectivityAvailable()) 
{ 
    App.Notification.DisplayLocalNotifications("No Internet", "You need an internet connection to access certain application content"); 
} 

ich Injektion bin mit Abhängigkeit zu überprüfen, das entsprechende Modul für den Umgang mit Dialogfeldern für jede geeignete Umgebung zu bauen. Die Android wirft die folgende Ausnahme

Android.Views.WindowManagerBadTokenException: Kann nicht Fenster hinzufügen - Token null ist hier nicht für eine Anwendung ist der Code für die DisplayLocalNotification Methode auf dem Android:

public void DisplayLocalNotification(string title, string content) 
{   
    AlertDialog.Builder builder = new AlertDialog.Builder(Application.Context) 
      .SetTitle(title) 
      .SetMessage(content) 
      .SetCancelable(true) 
      .SetPositiveButton("OK", (EventHandler<DialogClickEventArgs>) null); 

     AlertDialog alert = builder.Create(); 
     alert.Show(); 

     var okBtn = alert.GetButton((int)DialogButtonType.Positive); 

     okBtn.Click += (sender, args) => 
     { 
      alert.Dismiss(); 
     }; 
} 

Nach einigen Nachforschungen muss ich die aktuelle Aktivität an den AlertDialog.Builder Konstruktor anstelle der Application.Context übergeben. Wie bekomme ich das aktuelle Aktivitätsobjekt aus dem Anwendungskontext, wenn Sie die Aktivität außerhalb des Aktivitätskontextes benötigen?

+0

Hat Xamarin nicht das Grundkonzept, die Instanz eines Objekts einfach mit 'this' zu übergeben? – Squonk

+0

@Squonk - Ja, es tut, aber dieser Code wird nicht von der Klasse aufgerufen, die vom Objekt 'AndroidActivity' erbt. Es ist in einer Klasse enthalten, die das aktuelle Aktivitätsobjekt nicht kennt, aber auf das 'Application.Context'-Objekt zugreifen kann. –

+1

Wenn Sie keine aktive' Aktivität' haben, können Sie nicht garantieren, dass eine solche existiert. Etwas muss sein active/visible, um den 'AlertDialog' zu erstellen. In diesem Fall sollten Sie den' Activity' 'Context' verwenden. Eine "Anwendung" in Android-Begriffen hat keine Sichtbarkeit und ist im Grunde ein Skelett-Framework. – Squonk

Antwort

24

Xamarin.Forms Der Android-Plattformcode sollte die aktuelle Aktivität der Forms.Context-Eigenschaft zuweisen. Dies ist die statische Forms-Klasse. Wenn Sie sie debuggen, werden Sie feststellen, dass der Forms.Context eine Aktivität ist.

public static class Forms 
{ 
    public static Context Context { get; } 
    public static bool IsInitialized { get; } 

    public static event EventHandler<ViewInitializedEventArgs> ViewInitialized; 

    public static void Init(Activity activity, Bundle bundle); 
} 
+0

Ja, die Klasse 'Xamarin.Forms.Forms' hat eine Init-Methodensignatur mit Aktivität als Eingabeparameter, ist aber nicht als Eigenschaft –

+3

zugänglich Es ist. Forms.Context ist die aktuelle Aktivität. – SKall

+2

Danke! Ersetzen dieses 'AlertDialog.Builder-Builders = neuer AlertDialog.Builder (Application.Context)' mit diesem 'AlertDialog.Builder-Builder = neuer AlertDialog.Builder (Forms.Context)' funktioniert –

Verwandte Themen