web-dev-qa-db-ja.com

Application.Contextから現在のアクティビティを取得します-MonoAndroid

現在、Xamarin.Formsを使用して、AndroidおよびiOSプラットフォームで利用できるアプリケーションを開発しています。アプリケーションを最初にデバイスにロードするときに、インターネットがあるかどうかを確認します。デバイスで接続が可能です。インターネット接続が利用できない場合は、ダイアログボックスを表示したいと思います。

これは、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コンストラクターに渡す必要があります。アクティビティコンテキスト外のアクティビティが必要な場合、アプリケーションコンテキストから現在のアクティビティオブジェクトを取得するにはどうすればよいですか?

9

Xamarin.Forms Androidプラットフォームコードは、現在のアクティビティをForms.Contextプロパティに割り当てる必要があります。これは静的Formsクラスであり、デバッグすると、Forms.Contextがアクティビティであることがわかります。

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);
}
24
SKall