如何在 xamarin.forms 中获取状态栏高度?
how can i get status bar height in xamarin.forms?
我正在尝试在我的应用程序中获取状态/操作栏高度。
我了解了一些我们如何在本地 android 中获取它。
我们可以在 xamarin.forms 中获取状态/操作栏高度吗?如果是,那么如何?
如果有人对此有任何想法,请提供帮助。
您可以通过创建自己的依赖服务来做到这一点。 (https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/dependency-service/introduction/)
在您的共享代码中,创建一个界面,例如 IStatusBar:
public interface IStatusBar
{
int GetHeight();
}
为 Android 平台添加实现:
[assembly: Dependency(typeof(StatusBar))]
namespace StatusBarApp.Droid
{
class StatusBar : IStatusBar
{
public static Activity Activity { get; set; }
public int GetHeight()
{
int statusBarHeight = -1;
int resourceId = Activity.Resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
{
statusBarHeight = Activity.Resources.GetDimensionPixelSize(resourceId);
}
return statusBarHeight;
}
}
}
Activity 属性 设置自 MainActivity.cs:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
StatusBar.Activity = this;
LoadApplication(new App());
}
}
这是从共享代码调用实现的方式:
int statusBarHeight = DependencyService.Get<IStatusBar>().GetHeight();
IOS 平台的实施:
[assembly: Dependency(typeof(StatusBar))]
namespace StatusBarApp.iOS
{
class StatusBar : IStatusBar
{
public int GetHeight()
{
return (int)UIApplication.SharedApplication.StatusBarFrame.Height;
}
}
}
常用代码(在App.xaml.cs)
public static int StatusBarHeight {get; set;}
Android部分(在MainActivity.cs,在OnCreate方法中)
int resourceId = Resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
{
App.StatusBarHeight = (int)(Resources.GetDimensionPixelSize(resourceId) / Resources.DisplayMetrics.Density);
}
iOS 部分(在 AppDelegate.cs 中,在 FinishedLaunching 方法中)
App.StatusBarHeight = (int)UIApplication.SharedApplication.StatusBarFrame.Height;
所以App.StatusBarHeight会在App启动的时候进行初始化,然后你就可以在普通代码的任何地方使用它了。
我使用了这样的依赖服务:
using System;
using System.IO;
using System.Threading.Tasks;
using Android.Content;
using Android.Content.Res;
using ProTrain.Droid.DependencyServices;
using ProTrain.Interfaces;
[assembly: Xamarin.Forms.Dependency(typeof(PlatformStuff))]
namespace MyApp.Droid.DependencyServices
{
public class PlatformStuff : IPlatformStuff
{
internal static Func<Context> GetContext { get; set; }
public int GetToolbarSize()
{
var Context = GetContext();
TypedArray styledAttributes = Context.Theme.ObtainStyledAttributes(
new int[] { Android.Resource.Attribute.ActionBarSize });
var actionbar = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
return actionbar;
}
}
}
然后在主活动中我设置了上下文:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
PlatformStuff.GetContext = () => this;
...
此页面上的其他答案对我不起作用。他们返回的值比实际状态栏小 ~8 DP,导致我所有的计算都关闭了。
这是一个有效的纯 Xamarin Forms 解决方案:
// Tested only in Android
private double NavbarHeight =>
Application.Current.MainPage is NavigationPage navPage && navPage.CurrentPage != null
? navPage.Height - navPage.CurrentPage.Height
: 0;
不幸的是,这依赖于所有页面都扩展到其完整父容器的假设,这并不总是正确的。
也是returnsDP中的高度。如果你想要以像素为单位的高度,乘以 DeviceDisplay.MainDisplayInfo.Density
我正在尝试在我的应用程序中获取状态/操作栏高度。
我了解了一些我们如何在本地 android 中获取它。
我们可以在 xamarin.forms 中获取状态/操作栏高度吗?如果是,那么如何?
如果有人对此有任何想法,请提供帮助。
您可以通过创建自己的依赖服务来做到这一点。 (https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/dependency-service/introduction/)
在您的共享代码中,创建一个界面,例如 IStatusBar:
public interface IStatusBar
{
int GetHeight();
}
为 Android 平台添加实现:
[assembly: Dependency(typeof(StatusBar))]
namespace StatusBarApp.Droid
{
class StatusBar : IStatusBar
{
public static Activity Activity { get; set; }
public int GetHeight()
{
int statusBarHeight = -1;
int resourceId = Activity.Resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
{
statusBarHeight = Activity.Resources.GetDimensionPixelSize(resourceId);
}
return statusBarHeight;
}
}
}
Activity 属性 设置自 MainActivity.cs:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
StatusBar.Activity = this;
LoadApplication(new App());
}
}
这是从共享代码调用实现的方式:
int statusBarHeight = DependencyService.Get<IStatusBar>().GetHeight();
IOS 平台的实施:
[assembly: Dependency(typeof(StatusBar))]
namespace StatusBarApp.iOS
{
class StatusBar : IStatusBar
{
public int GetHeight()
{
return (int)UIApplication.SharedApplication.StatusBarFrame.Height;
}
}
}
常用代码(在App.xaml.cs)
public static int StatusBarHeight {get; set;}
Android部分(在MainActivity.cs,在OnCreate方法中)
int resourceId = Resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
{
App.StatusBarHeight = (int)(Resources.GetDimensionPixelSize(resourceId) / Resources.DisplayMetrics.Density);
}
iOS 部分(在 AppDelegate.cs 中,在 FinishedLaunching 方法中)
App.StatusBarHeight = (int)UIApplication.SharedApplication.StatusBarFrame.Height;
所以App.StatusBarHeight会在App启动的时候进行初始化,然后你就可以在普通代码的任何地方使用它了。
我使用了这样的依赖服务:
using System;
using System.IO;
using System.Threading.Tasks;
using Android.Content;
using Android.Content.Res;
using ProTrain.Droid.DependencyServices;
using ProTrain.Interfaces;
[assembly: Xamarin.Forms.Dependency(typeof(PlatformStuff))]
namespace MyApp.Droid.DependencyServices
{
public class PlatformStuff : IPlatformStuff
{
internal static Func<Context> GetContext { get; set; }
public int GetToolbarSize()
{
var Context = GetContext();
TypedArray styledAttributes = Context.Theme.ObtainStyledAttributes(
new int[] { Android.Resource.Attribute.ActionBarSize });
var actionbar = (int)styledAttributes.GetDimension(0, 0);
styledAttributes.Recycle();
return actionbar;
}
}
}
然后在主活动中我设置了上下文:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
PlatformStuff.GetContext = () => this;
...
此页面上的其他答案对我不起作用。他们返回的值比实际状态栏小 ~8 DP,导致我所有的计算都关闭了。
这是一个有效的纯 Xamarin Forms 解决方案:
// Tested only in Android
private double NavbarHeight =>
Application.Current.MainPage is NavigationPage navPage && navPage.CurrentPage != null
? navPage.Height - navPage.CurrentPage.Height
: 0;
不幸的是,这依赖于所有页面都扩展到其完整父容器的假设,这并不总是正确的。
也是returnsDP中的高度。如果你想要以像素为单位的高度,乘以 DeviceDisplay.MainDisplayInfo.Density