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?
Hat Xamarin nicht das Grundkonzept, die Instanz eines Objekts einfach mit 'this' zu übergeben? – Squonk
@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. –
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