Обратный вызов Xamarin MessagingCenter не вызывается
Я реализую детектор ориентации устройства с помощью Xamarin MessagingCenter. Я хотел бы отправлять сообщения из моего проекта MainActivity в Android в реализацию класса Singleton внутри моего проекта.NET Standart.
Как вы можете видеть, я переопределил метод OnConfigurationChanged(...) внутри моей функции MainActivity, и все точки останова попадают в мои операторы IF, когда я переключаю ориентацию с альбомной на портретную. Проблема в том, что я новее получаю эти сообщения. Обратный звонок внутри моего "OrientationHelper" называется более новым.
"OrientationHelper" запускается при первой загрузке страницы (для тех, кто скажет, что у меня нет экземпляра:))
Основная деятельность:
public override void OnConfigurationChanged(Android.Content.Res.Configuration newConfig)
{
base.OnConfigurationChanged(newConfig);
if (newConfig.Orientation == Android.Content.Res.Orientation.Landscape)
MessagingCenter.Send(this, "OrientationContract"
, new OrientationChangedEventArgs(Orientation.Landscape));
else if (newConfig.Orientation == Android.Content.Res.Orientation.Portrait)
MessagingCenter.Send(this, "OrientationContract"
, new OrientationChangedEventArgs(Orientation.Portrait));
}
Класс Singleton, который будет получать сообщения от MainActivity:
public class OrientationHelper
{
private OrientationHelper()
=> MessagingCenter.Subscribe<OrientationChangedEventArgs>(this, "OrientationContract"
, s => DeviceOrientation = s.Orientation);
private static OrientationHelper s_instace;
public static OrientationHelper Instance
{
get
{
if (s_instace == null)
s_instace = new OrientationHelper();
return s_instace;
}
}
private Orientation _deviceOrientation;
public Orientation DeviceOrientation
{
get => _deviceOrientation;
private set
{
if (_deviceOrientation == value)
return;
_deviceOrientation = value;
}
}
}
OrientationChangedEventArgs:
public class OrientationChangedEventArgs : EventArgs
{
public Orientation Orientation { get; private set; }
public OrientationChangedEventArgs(Orientation orientation)
=> Orientation = orientation;
}
1 ответ
Методы подписки и отправки определены следующим образом
Подписаться (объект подписчик, строковое сообщение, обратный вызов действия, TSender source = null)
Send (отправитель TSender, строковое сообщение) Send (отправитель TSender, строковое сообщение, аргументы TArgs)
первый T
параметр в обоих вызовах должен соответствовать типу класса, отправляющего сообщение
MessagingCenter.Send<MyType, OrientationChangedEventArgs>(this, "OrientationContract"
, new OrientationChangedEventArgs(Orientation.Landscape));
MessagingCenter.Subscribe<MyType, OrientationChangedEventArgs>(this, "OrientationContract"
, s => DeviceOrientation = s.Orientation);