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: Невозможно добавить окно - маркер нуль не для приложения Вот код для метода DisplayLocalNotification на Android:

После выполнения некоторых исследований мне нужно передать текущую активность в конструктор AlertDialog.Builder вместо Application.Context. Как получить текущий объект активности из контекста приложения, когда вам нужно заниматься за пределами контекста активности?

+0

У Xamarin нет базовой концепции передачи экземпляра объекта, просто используя 'this'? – Squonk

+0

@Squonk - Да, но этот код не вызывается из класса, который наследуется от объекта AndroidActivity. Он содержится в классе, который не знает текущий объект активности, но может получить доступ к объекту «Application.Context» –

+1

Если у вас нет активной «Деятельности», вы не можете гарантировать, что она существует, что-то должно быть активным/видимым для создания «AlertDialog», в этом случае вы должны использовать этот «Activity'' Context'. «Приложение» в терминах Android не имеет видимости и в основном представляет собой структуру скелета. – Squonk

ответ

24

Xamarin.Forms Код платформы Android должен назначать текущую активность в свойство 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 с активностью в качестве входного параметра, но он недоступен как свойство –

+3

Это. Forms.Context - текущая деятельность. – SKall

+2

Спасибо! Замена этого 'AlertDialog.Builder builder = new AlertDialog.Builder (Application.Context)' с этим 'AlertDialog.Builder builder = new AlertDialog.Builder (Forms.Context)' works –

Смежные вопросы