2017-09-14 16 views
0

Android 용 Xamarin Form 기반 응용 프로그램에서 Statusbar가 ContentPage와 겹치는 문제가 있습니다.XamarinForm : Android : Statusbar overlap contentpage

하드 코드 설정 XAML의 ContentPage 두께 값은 각 Android 장치에서 작동하지 않을 수 있습니다.

블로그에서 몇 가지 해결책을 찾았지만 아무도 일하지 않았습니다. Xamarin.Droid 프로젝트에서 상태 표시 줄 높이를 계산하고 내용 페이지로 패딩을 설정합니다.

그렇다면 누구나 상태 표시 줄의 높이를 계산하여 런타임시 콘텐츠 페이지 상단에 패딩을 설정하는 방법에 대해 제안 하시겠습니까?

미리 감사드립니다.

답변

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; 
    } 
} 

이것은 내 문제를 해결했습니다.