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