После выхода из полноэкранного режима в приложении Xamarin Forms для Android строка состояния перекрывает страницу

У меня есть приложение, которое переключается между полноэкранным режимом (без строки состояния и ограниченным альбомной ориентацией) и обычным (со строкой состояния и без ограничения ориентации).

Я использую сервисную зависимость для вызова метода 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. Интересно, что он НЕ страдает от раздражения, когда строка состояния появляется и исчезает при переходе между двумя полноэкранными страницами.

Не могли бы вы предоставить фрагмент кода для воспроизведения? Что вы имеете в виду под перекрытием? Вы имеете в виду две страницы?

Wendy Zang - MSFT 24.12.2020 10:42

Под перекрытием я подразумеваю визуально. Строка состояния занимает верхнюю часть страницы. В частности, он покрывает примерно половину панели навигации.

aptwebapps 24.12.2020 11:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
411
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я протестировал ваш проект и воспроизвел покрытие верхней части страницы.

Воспроизвести:

Добавьте приведенный ниже код перед 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.

Другие вопросы по теме