XamarinForm:Android:状态栏重叠内容页
XamarinForm : Android : Statusbar overlap contentpage
在 Android 的基于 Xamarin Form 的应用程序中,我遇到一个问题,即 Statusbar 与 ContentPage 重叠。
在 XAML 中为 ContentPage 设置硬代码厚度值可能不适用于每个 Android 设备。
所以,我在博客上找到的解决方案很少,但对任何人都不起作用。到处都写着从 Xamarin.Droid 项目计算状态栏高度并将填充设置到内容页面。
所以有人请建议如何通过计算状态栏高度在运行时将 Padding 设置在内容页面的顶部吗?
提前致谢。
我找到了解决方案:
为此我们需要创建自定义渲染器。
请从 Xamarin.Droid 项目中找到下面提到的 PageRenderer 代码:
[assembly: ExportRenderer(typeof(ContentPage), typeof(MyContentPageRenderer))]
命名空间ProjectName.Droid.Renderer
{
public class MyContentPageRenderer : PageRenderer
{
public MyContentPageRenderer()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
float pixWidth = (float)Resources.DisplayMetrics.WidthPixels;
float fdpWidth = (float)App.Current.MainPage.Width;
float pixPerDp = pixWidth / fdpWidth;
this.Element.Padding = new Thickness(0, MainActivity.StatusBarHeight/pixPerDp, 0, 0);
} } }
并且请找到下面提到的 "MainActivity" 的 StatusBarHeight 计算代码:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static int StatusBarHeight;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
Window.DecorView.SystemUiVisibility = 0;
var statusBarHeightInfo = typeof(FormsAppCompatActivity).GetField("_statusBarHeight", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
statusBarHeightInfo.SetValue(this, 0);
Window.SetStatusBarColor(new Android.Graphics.Color(18, 52, 86, 255));
}
LoadApplication(new App());
StatusBarHeight = getStatusBarHeight();
}
public int getStatusBarHeight()
{
int statusBarHeight = 0, totalHeight = 0, contentHeight = 0;
int resourceId = Resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
{
statusBarHeight = Resources.GetDimensionPixelSize(resourceId);
}
return statusBarHeight;
}
}
这解决了我的问题。
在 Android 的基于 Xamarin Form 的应用程序中,我遇到一个问题,即 Statusbar 与 ContentPage 重叠。
在 XAML 中为 ContentPage 设置硬代码厚度值可能不适用于每个 Android 设备。
所以,我在博客上找到的解决方案很少,但对任何人都不起作用。到处都写着从 Xamarin.Droid 项目计算状态栏高度并将填充设置到内容页面。
所以有人请建议如何通过计算状态栏高度在运行时将 Padding 设置在内容页面的顶部吗?
提前致谢。
我找到了解决方案:
为此我们需要创建自定义渲染器。
请从 Xamarin.Droid 项目中找到下面提到的 PageRenderer 代码:
[assembly: ExportRenderer(typeof(ContentPage), typeof(MyContentPageRenderer))]
命名空间ProjectName.Droid.Renderer
{
public class MyContentPageRenderer : PageRenderer
{
public MyContentPageRenderer()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
float pixWidth = (float)Resources.DisplayMetrics.WidthPixels;
float fdpWidth = (float)App.Current.MainPage.Width;
float pixPerDp = pixWidth / fdpWidth;
this.Element.Padding = new Thickness(0, MainActivity.StatusBarHeight/pixPerDp, 0, 0);
} } }
并且请找到下面提到的 "MainActivity" 的 StatusBarHeight 计算代码:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static int StatusBarHeight;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
Window.DecorView.SystemUiVisibility = 0;
var statusBarHeightInfo = typeof(FormsAppCompatActivity).GetField("_statusBarHeight", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
statusBarHeightInfo.SetValue(this, 0);
Window.SetStatusBarColor(new Android.Graphics.Color(18, 52, 86, 255));
}
LoadApplication(new App());
StatusBarHeight = getStatusBarHeight();
}
public int getStatusBarHeight()
{
int statusBarHeight = 0, totalHeight = 0, contentHeight = 0;
int resourceId = Resources.GetIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
{
statusBarHeight = Resources.GetDimensionPixelSize(resourceId);
}
return statusBarHeight;
}
}
这解决了我的问题。