在 Xamarin Forms Android 应用程序中退出全屏后,状态栏与页面重叠

问题描述

我有一个应用可以在全屏(没有状态栏,仅限于横向)和常规(有状态栏,没有方向限制)之间切换。

我正在使用服务依赖项通过布尔标志调用 MainActivity 上的方法

我使用了两种不同的方法来切换全屏设置:设置 Window.DecorView.systemUIVisibility 和在 Window 上添加/清除标志。在下面的代码中,第二种方法被注释掉了:

                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 的主要问题。有趣的是,在两个全屏页面之间移动时,它不会受到状态栏弹出和弹出的烦恼。

解决方法

我已经测试了您的项目并复制了页面顶部的覆盖部分。

复制:

enter image description here

enter image description here

在 MainActivity 的 base.OnCreate(savedInstanceState); 之前添加以下代码。

  this.Window.AddFlags(WindowManagerFlags.Fullscreen | WindowManagerFlags.TurnScreenOn);

截图:

enter image description here

enter image description here