XamarinForm:Android:状态栏重叠内容页面

时间:2017-09-14 13:21:56

标签: android xamarin xamarin.forms overlap android-statusbar

在基于Xamarin Form的Android应用程序中,我遇到状态栏与ContentPage重叠的问题。

设置硬编码XAML中ContentPage的厚度值可能不适用于每个Android设备。

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

所以有人请建议如何通过计算状态栏高度将Padding设置为运行时内容页面的顶部?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案:

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

请从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);

    } } }

请找到&#34; MainActivity&#34;的代码如下面提到的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;
    }
}

这解决了我的问题。