2017-02-14 3 views
2

Ich versuche, eine einfache Geolokalisierung App zu erstellen, die auf den Standort des Benutzers auf einer Karte nach dem Login zeigen sollte. Dieser Teil funktioniert gut, aber es gibt einen weißen Bereich, den ich gerne aus der Statusleiste und der Ansicht entfernt sehen würde, aber ich weiß nicht wie.Ein weißer Balken zwischen StatusBar und MasterDetailPage Xamarin.Forms Android

Hier sind zwei Links zu Bildschirmen des Fehlers:

enter image description here

enter image description here

Ich habe bereits versucht, die Lösungen hier vorgestellt: https://forums.xamarin.com/discussion/86568/unwanted-blank-space-above-navigation-bar-navigation-page aber es nicht gut funktionierte: die XAML-Lösungen didn tue nichts, und die letzte Lösung (mit der Überprüfung der Build-Version) hat den blauen Balken ebenfalls verschwinden lassen, was nicht der erforschte Effekt ist.

ist hier etwas von meinem Code, mir zu sagen, wenn Sie etwas brauchen mehr:

Die Seite, wo ich meine Karte zeigen:

<?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> 

Und hier ist der 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> 

Danke für Ihre Hilfe!

EDIT:

ist die Struktur meines Projektes:

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

Das Problem ist, ich mit ihm nicht völlig frei bin, ich ein Praktikum bin und muss der Client-Befehl folgen ..

+0

Was ist Ihr 'MainPage' Setup ist? Ist es eine 'NavigationPage'? Wenn ja, ändere es so, dass es eine 'MasterDetailPage' ist und dass dann Master & Detail '' NavigationPage'' sein sollte. – Krumelur

Antwort

2

Es ist so in Xamarin Formen gebaut - es fügt immer Top-Padding. Ein Bug wurde dafür ausgelöst, aber keine Ahnung, wann es behoben wird.

Ich habe es geschafft, um es mit einem benutzerdefinierten Renderer zu arbeiten, die etwas hacky Reflexion tut:

[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

Sie können auch versuchen, eine negative Auffüllung direkt in Forms festzulegen. Keine Notwendigkeit für einen Renderer vielleicht. – Krumelur

+0

Ich habe das negative Padding versucht, aber es hat nur meinen Inhalt unter die Navigationsleiste geschoben, ohne den Leerraum zu stören. [link] (http://i.imgur.com/Q5XOTFU.png) –

+0

Auch @JimBobBennett, ich bin sehr interessiert an Ihrer Antwort, aber ich verstehe nicht ganz, wie es verwendet werden sollte ... ich nehme an Renderer sollte im Android-Projekt (und nicht im Portable-Projekt) platziert werden, da es sich um die Plattform handelt, aber wie verwende ich sie? –

Verwandte Themen