2017-09-14 142 views
0

在Android的基于Xamarin表单的应用程序中,我遇到Statusbar与ContentPage重叠的问题。XamarinForm:Android:状态栏重叠内容页面

设置硬代码XAML中ContentPage的厚度值可能无法用于每个Android设备。

所以,我在博客上找到了一些解决方案,但没有任何人工作。从Xamarin.Droid项目计算状态栏高度并设置填充到内容页面的地方。

因此,任何人都请通过计算Statusbar高度来建议如何在运行时的内容页面上设置Padding顶部?

在此先感谢。

回答

0

我找到了解决方案:

为此,我们需要创建自定义渲染器。

请在下面找到从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; 
    } 
} 

这解决了我的问题。