9

Şu anda Android ve iOS platformlarında mevcut olacak Xamarin.Forms kullanarak bir uygulama geliştiriyorum. Uygulama ilk kez cihaza yüklendiğinde, cihazda bir internet bağlantısı olup olmadığını kontrol ediyorum. İnternet bağlantısı yoksa bir iletişim kutusu görüntülemek istiyorum. İşteGeçerli etkinliği etkin duruma getirme App.Context - MonoAndroid

aşağıdaki kod parçacığını ben her uygun ortam için iletişim kutularını taşıma için uygun bir modül oluşturmak için bağımlılık enjeksiyon kullanıyorum Xamarin.Forms.ContentPage

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

üzerinde internet kontrol etmek kullanıyorum olduğunu. Android Aşağıdaki istisna

Android.Views.WindowManagerBadTokenException atıyor: -:

penceresini eklenemedi'yi belirteç boş İşte bir uygulama için değil Android'de DisplayLocalNotification yöntemine ilişkin koddur
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(); 
     }; 
} 

Bazı araştırmalar yaptıktan sonra, Application.Context yerine AlertDialog.Builder yapıcıya geçerli etkinliği iletmem gerekiyor. Etkinliğin dışındaki etkinliklere ihtiyaç duyduğunuzda, geçerli etkinlik nesnesini uygulama bağlamından nasıl alabilirim?

+0

Xamarin bir nesnenin örneğini basitçe 'this' kullanarak geçirme kavramına sahip değil mi? – Squonk

+0

@Squonk - Evet, ancak bu kod, "AndroidActivity" nesnesinden miras alınan sınıftan çağrılmıyor. Geçerli etkinlik nesnesini bilmeyen bir sınıf içinde yer alır, ancak 'Application.Context' nesnesine erişebilir –

+1

Etkin bir "Etkinliğiniz" yoksa, bunun varlığını garanti edemezsiniz. "AlertDialog" öğesini oluşturmak için etkin/görünür durumdadır, bu durumda 'Etkinlik' Bağlamı'nı kullanmanız gerekir. Android terimlerindeki bir Uygulamanın görünürlüğü yoktur ve temelde bir iskelet çerçevesidir. – Squonk

cevap

24

Xamarin.Forms Android platform kodu, geçerli Etkinliği Forms.Context özelliğine atamalıdır. Bu, statik Forms sınıfıdır ve siz debug ederseniz, Forms.Context'in bir Etkinlik olduğunu görürsünüz.

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

Evet, 'Xamarin.Forms.Forms' sınıfı, bir girdi parametresi olarak Activity ile bir Init yöntemi imzasına sahiptir, ancak bir özellik olarak erişilemez, –

+3

Bu. Forms.Context mevcut etkinliktir. – SKall

+2

Teşekkürler! Bunun yerine 'AlertDialog.Builder = new AlertDialog.Builder (Application.Context) 'ile bu' AlertDialog.Builder = new AlertDialog.Builder (Forms.Context) 'çalışır –