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();
}
我有一个 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();
}