2017-02-14 10 views
2

Я пытаюсь создать простое приложение геолокализации, которое должно указывать на местоположение пользователя на карте после входа в систему. Эта часть работает отлично, но есть пробел, который я хотел бы видеть, удаленный из строки состояния и представления, но я не знаю, как это сделать.Появилась белая полоса между StatusBar и MasterDetailPage Xamarin.Forms Android

Вот две ссылки на экраны ошибки:

enter image description here

enter image description here

Я уже пробовал решения, представленные здесь: https://forums.xamarin.com/discussion/86568/unwanted-blank-space-above-navigation-bar-navigation-page , но он не работает: хорошо XAML решения Бесполезный ничего не делать, и последнее решение (с проверкой версии сборки) заставило синюю полосу исчезнуть, что не является исследованным эффектом.

Вот некоторые из моего кода, скажите мне, если вам нужно что-нибудь еще:

На странице, где я показать свою карту:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="MyApp.View.Detail" 
      xmlns:i18n="clr-namespace:MyApp" 
      Title="" 
      BackgroundColor="{StaticResource MainBackgroundColor}" 
      xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"> 
    <StackLayout> 
    <ActivityIndicator IsRunning="{Binding IsBusy, Mode=TwoWay}" IsVisible="{Binding IsBusy, Mode=TwoWay}" Color="Blue"/> 
    <maps:Map VerticalOptions ="FillAndExpand" HorizontalOptions ="FillAndExpand" 
      x:Name="MyMap" 
      IsShowingUser="true" 
      MapType="Street" 
     /> 
    </StackLayout> 
</ContentPage> 

А вот MasterViewDetail

<?xml version="1.0" encoding="utf-8" ?> 
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="MyApp.View.HomePage"> 

</MasterDetailPage> 

Спасибо за помощь!

EDIT:

Вот структура моего проекта:

App(NavigationPage) 
    MainPage (ContentPage) 
     LoginPage (ContentPage) 
      HomePage (MasterDetailPage) 
       HomeDetail(ContentPage) 
     RegisterPage (ContentPage) 

Проблема в том, я не полностью свободен с ним, я стажером и должен следовать командам клиента .. .

+0

Что вы 'установки MainPage'? Это «NavigationPage»? Если да, измените его так, чтобы он был «MasterDetailPage», а затем master & detail должен быть «NavigationPage's». – Krumelur

ответ

2

Он построен таким образом внутри форм Xamarin - он всегда добавляет верхнюю прокладку. Для этого была поднята ошибка, но не знаю, когда она будет исправлена.

мне удалось обойти с помощью пользовательского средства визуализации, что делает некоторые Hacky отражение:

[assembly: ExportRenderer(typeof(MasterDetailPage), typeof(NoSpaceMasterDetailPageRenderer))] 

namespace Droid.Renderers 
{ 
    public class NoSpaceMasterDetailPageRenderer : MasterDetailPageRenderer 
    { 
     /// <summary> 
     /// When adding a view, tweak the top padding if necessary. 
     /// According to: 
     /// https://github.com/xamarin/Xamarin.Forms/blob/589adbd3ef145ec85f9fe64eda008251c1cdb745/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs 
     /// The TopPadding is always set for the detail. This works fine when the master detail is shown normally, but 
     /// if it is inside a navigation page (such as the inspection view) then you get extra unwanted padding. 
     /// The 'fix' is to set the top padding to 0 for the detail, only of course the types and fields are hidden from us... 
     /// </summary> 
     /// <param name="child">Child.</param> 
     public override void AddView(Android.Views.View child) 
     { 
      try 
      { 
       var isMasterField = child.GetType().GetField("_isMaster", BindingFlags.NonPublic | BindingFlags.Instance); 
       if (isMasterField == null) return; 

       var isMaster = isMasterField.GetValue(child); 
       if ((bool)isMaster) return; 

       var parentField = child.GetType().GetField("_parent", BindingFlags.NonPublic | BindingFlags.Instance); 
       if (parentField == null) return; 

       var parent = parentField.GetValue(child) as MasterDetailPage; 
       if (parent == null || !(parent.Parent is NavigationPage)) return; 

       var topPaddingProperty = child.GetType().GetProperty("TopPadding", BindingFlags.Public | BindingFlags.Instance); 
       if (topPaddingProperty != null) 
        topPaddingProperty.SetValue(child, 0); 
      } 
      finally 
      { 
       base.AddView(child); 
      } 
     } 
    } 
} 
+0

Вы также можете попробовать установить отрицательную прокладку непосредственно в Формах. Возможно, нет необходимости в рендерере. – Krumelur

+0

Я пробовал отрицательную прокладку, но только подтолкнул мой контент под панель навигации, не мешая пустому пространству. [link] (http://i.imgur.com/Q5XOTFU.png) –

+0

Также @JimBobBennett, я очень заинтересован в вашем ответе, но я не совсем понимаю, как его использовать ... Я полагаю, рендерер должен быть помещен в проект Android (а не в Portable Project), поскольку он имеет дело с платформой, но как я могу ее использовать? –