У меня есть приложение, которое переключается между полноэкранным режимом (без строки состояния и ограниченным альбомной ориентацией) и обычным (со строкой состояния и без ограничения ориентации).
Я использую сервисную зависимость для вызова метода MainActivity
с логическим флагом.
Я использовал два разных метода переключения полноэкранного режима: установка Window.DecorView.SystemUiVisibility
и добавление/снятие флажков в окне. В приведенном ниже коде второй подход закомментирован:
if (fullScreenOn)
{
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)(
SystemUiFlags.Fullscreen
| SystemUiFlags.HideNavigation
| SystemUiFlags.Immersive
| SystemUiFlags.ImmersiveSticky
| SystemUiFlags.LowProfile
| SystemUiFlags.LayoutStable
| SystemUiFlags.LayoutHideNavigation
| SystemUiFlags.LayoutFullscreen
);
//Window.AddFlags(WindowManagerFlags.Fullscreen);
RequestedOrientation = ScreenOrientation.Landscape;
}
else
{
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)(
SystemUiFlags.LayoutStable
| SystemUiFlags.LayoutHideNavigation
| SystemUiFlags.LayoutFullscreen
);
//Window.ClearFlags(WindowManagerFlags.Fullscreen);
RequestedOrientation = ScreenOrientation.Unspecified;
}
Я пробовал вызывать метод зависимости из разных мест: OnAppearing()
и OnDisappearing()
на полноэкранных страницах, на всех страницах, просто OnAppearing()
на всех страницах, а также (не в той же сборке) из моего навигационного кода при открытии новой страницы или откаты. к существующему.
Приложение запускается на обычной странице, и все это работает до тех пор, пока вы не просмотрите одну из полноэкранных страниц и не вернетесь на обычную страницу, когда строка состояния вернется, но страница использует всю высоту экрана и в результате перекрывается.
Есть еще одна неприятность, которая заключается в том, что даже при переходе с одной полноэкранной страницы на другую строка состояния появляется и исчезает.
Версия приложения для iOS не имеет ни одной из этих проблем. Очевидно, он использует другую реализацию в методе зависимости.
Редактировать
Я создал минимальное приложение, которое воспроизводит основную проблему на https://github.com/aptwebapps/StatusBarBug. Интересно, что он НЕ страдает от раздражения, когда строка состояния появляется и исчезает при переходе между двумя полноэкранными страницами.
Под перекрытием я подразумеваю визуально. Строка состояния занимает верхнюю часть страницы. В частности, он покрывает примерно половину панели навигации.
Я протестировал ваш проект и воспроизвел покрытие верхней части страницы.
Воспроизвести:
Добавьте приведенный ниже код перед base.OnCreate(savedInstanceState);
в MainActivity.
this.Window.AddFlags(WindowManagerFlags.Fullscreen | WindowManagerFlags.TurnScreenOn);
Скриншот:
Что ж, я решил это, очистив флаг с кодом, специфичным для устройства.
MainActivity.Instance.Window.ClearFlags(WindowManagerFlags.Fullscreen);
Если приложение переходит на определенную страницу, я использовал код для конкретной платформы:
MainActivity.Instance.RequestedOrientation = ScreenOrientation.Landscape;
и при выходе я вернул его к портрету. Но моя страница добавляла флаг для полноэкранного режима с помощью метода AddFlags()
в Android.
Надеюсь, это поможет другим, кто сталкивается с подобной проблемой.
Надеюсь, вы знаете, что большая часть кода устарела в более высоких версиях Android.
Не могли бы вы предоставить фрагмент кода для воспроизведения? Что вы имеете в виду под перекрытием? Вы имеете в виду две страницы?