9

我目前正在開發一個應用程序,使用Xamarin.Forms,將在Android和iOS平臺上提供。當應用程序首次加載到設備上時,我檢查設備上是否有可用的互聯網連接。如果互聯網連接不可用,我想顯示一個對話框。從Application.Context獲取當前活動 - MonoAndroid

這裏是下面的代碼片段,我使用去檢查Xamarin.Forms.ContentPage

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

互聯網我使用依賴注入建立處理對話框每個合適的環境中相應的模塊。而Android拋出以下異常

Android.Views.WindowManagerBadTokenException:無法添加窗口 - 令牌null不是一個應用程序下面是對Android的 DisplayLocalNotification方法的代碼:

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(); 
     }; 
} 

在做了一些研究後,我需要將當前活動傳遞給AlertDialog.Builder構造函數而不是Application.Context。當您需要活動環境之外的活動時,如何從應用程序上下文獲取當前活動對象?

+0

Xamarin沒有通過簡單地使用'this'來傳遞對象實例的基本概念嗎? – Squonk 2014-09-01 21:55:37

+0

@Squonk - 是的,它的確如此,但是這個代碼並沒有從繼承自「AndroidActivity」對象的類中調用。它包含在一個不知道當前活動對象的類中,但可以訪問'Application.Context'對象 – 2014-09-01 22:01:43

+1

如果你沒有一個活動的'Activity',那麼你不能保證它存在,必須的東西主動/可見爲了創建'AlertDialog',在這種情況下你應該使用'Activity''Context'。 Android條款中的「Application」沒有可見性,基本上是一個框架框架。 – Squonk 2014-09-01 22:23:36

回答

24

Xamarin.Forms Android平臺代碼應該將當前Activity分配給Forms.Context屬性。這是靜態的Forms類,如果你調試它,你會看到Forms.Context是一個Activity。

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

是的,'Xamarin.Forms.Forms'類有一個Init方法簽名,其中Activity作爲輸入參數,但它不作爲屬性 – 2014-09-02 17:20:38

+3

它是。 Forms.Context是當前的活動。 – SKall 2014-09-02 17:25:31

+2

謝謝!用這個'AlertDialog.Builder builder = new AlertDialog.Builder(Forms.Context)'替換'AlertDialog.Builder builder = new AlertDialog.Builder(Application.Context)'作品 – 2014-09-02 18:06:00