Return 从输入字段更改 Focus 后到 ImmersiveSticky

Return to ImmersiveSticky after FocusChanged from Entry Field

我有一个 Xamarin Forms 应用程序,在主屏幕上,我希望它是全屏的,隐藏底部导航栏和状态栏。

我已经能够完成它,但我有另一个页面,我导航到一些输入字段,一旦我点击输入字段,栏 return 并且当我 return 到我的主页,然后我必须重新启动应用程序才能再次全屏显示。有谁知道我该怎么做?

这是在应用程序启动时隐藏状态栏和导航栏的代码...

protected override void OnCreate(Bundle savedInstanceState)
{
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    base.OnCreate(savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

    int uiOptions = (int)Window.DecorView.SystemUiVisibility;

    uiOptions |= (int)SystemUiFlags.LowProfile;
    uiOptions |= (int)SystemUiFlags.Fullscreen;
    uiOptions |= (int)SystemUiFlags.HideNavigation;
    uiOptions |= (int)SystemUiFlags.LayoutHideNavigation;
    uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
    uiOptions |= (int)SystemUiFlags.LayoutStable;
    uiOptions |= (int)SystemUiFlags.LayoutFullscreen;

    Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;

    LoadApplication(new App());
}

我尝试用上面的代码覆盖 OnResume,但一旦应用程序加载,它就永远不会点击 OnResume

您可以通过这种方式添加一个标志。

protected override void OnCreate(Bundle savedInstanceState)
{
    MessagingCenter.Subscribe<string>(this, "showBar", (sender) =>
    {

        this.Window.ClearFlags(WindowManagerFlags.Fullscreen);
        this.Window.ClearFlags(WindowManagerFlags.KeepScreenOn);

    });
    TabLayoutResource = Resource.Layout.Tabbar;
    ToolbarResource = Resource.Layout.Toolbar;

    this.Window.AddFlags(WindowManagerFlags.Fullscreen);
    this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);
    base.OnCreate(savedInstanceState);

    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

    AnimationViewRenderer.Init();
    ButtonCircleRenderer.Init();

    CrossCurrentActivity.Current.Init(this, savedInstanceState);

    LoadApplication(new App());
}

您可以在 Xamarin.forms 中使用 DependencyService 实现它。

在表单中,创建一个界面

public interface IStatusBar
{
    void HideStatusBar();
    void ShowStatusBar();
}

在Android

我们可以使用插件 CurrentActivityPlugin .

只需在MainActivity的OnCreate上调用Init方法

base.OnCreate(savedInstanceState);
CrossCurrentActivity.Current.Init(this, savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
using Plugin.CurrentActivity;
using Android.Views;
using App16.Droid;


[assembly: Xamarin.Forms.Dependency(typeof(StatusBarImplementation))]
namespace App16.Droid
{
    public class StatusBarImplementation : IStatusBar
    {
        public StatusBarImplementation()
        {
        }

        WindowManagerFlags _originalFlags;

        #region IStatusBar implementation

        public void HideStatusBar()
        {
            var activity = CrossCurrentActivity.Current.Activity;
            var attrs = activity.Window.Attributes;
            _originalFlags = attrs.Flags;
            attrs.Flags |= Android.Views.WindowManagerFlags.Fullscreen;
            activity.Window.Attributes = attrs;
        }

        public void ShowStatusBar()
        {
            var activity = CrossCurrentActivity.Current.Activity;
            var attrs = activity.Window.Attributes;
            attrs.Flags = _originalFlags;
            activity.Window.Attributes = attrs;
        }

        #endregion
    }
}

在iOS

[assembly: Xamarin.Forms.Dependency(typeof(StatusBarImplementation))]
namespace xxx.iOS
{
    public class StatusBarImplementation : IStatusBar
    {
        public StatusBarImplementation()
        {
        }
      
        public void HideStatusBar()
        {
            UIApplication.SharedApplication.StatusBarHidden = true;
        }

        public void ShowStatusBar()
        {
            UIApplication.SharedApplication.StatusBarHidden = false;
        }

     
    }
}

在您的主页中

protected override void OnAppearing()
{
   base.OnAppearing();
   NavigationPage.SetHasNavigationBar(this, false);
   // hide
   DependencyService.Get<IStatusBar>().HideStatusBar();
}

protected override void OnDisappearing()
{
   base.OnDisappearing();
   NavigationPage.SetHasNavigationBar(this, true);
   // show
   DependencyService.Get<IStatusBar>().ShowStatusBar();
}