web-dev-qa-db-de.com

Wie kann ich in Xamarin Forms 3.1 bei der Verwendung von Registerkarten mit 4 Registerkarten verhindern, dass sich die Registerkartenleiste in Android verschiebt?

Ich habe eine App mit vier Seiten und möchte, dass sie meiner (Nicht-Xamarin) -IOS-App ähnelt, sodass die Symbolleiste unten angezeigt wird. Hier ist meine MainPage.xaml-Datei:

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XaBLE1"
             x:Class="XaBLE1.MainPage"
            Title="Safe-T Sim" HeightRequest="768" WidthRequest="512" 

            BarBackgroundColor="#F1F1F1"
            BarTextColor="Gray"
            xmlns:Android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;Assembly=Xamarin.Forms.Core"
            Android:TabbedPage.ToolbarPlacement="Bottom"
            Android:TabbedPage.BarItemColor="#666666"
            Android:TabbedPage.BarSelectedItemColor="Black"
            >

    <NavigationPage Title="Test" Icon="ElectTest.png"
                    HasNavigationBar="False">
        <x:Arguments>
            <local:TestPage />
        </x:Arguments>
    </NavigationPage>
    <NavigationPage Title="Review" Icon="Review.png"
                    HasNavigationBar="False">
        <x:Arguments>
            <local:ReviewPage />
        </x:Arguments>
    </NavigationPage>
    <NavigationPage Title="Setup" Icon="Gear.png"
                    HasNavigationBar="False">
        <x:Arguments>
            <local:SetupPage />
        </x:Arguments>
    </NavigationPage>
    <NavigationPage Title="Info" Icon="Info.png"
                    HasNavigationBar="False">
        <x:Arguments>
            <local:InfoPage />
        </x:Arguments>
    </NavigationPage>
</TabbedPage>

Ich interessiere mich nicht für das aktuelle Aussehen und Verhalten von Oreo, dh die Registerkarte der ausgewählten Seite wird größer, der Titel wird eingefügt, die anderen Registerkarten werden beiseite geschoben und der Seitentitel entfernt.
 Bottom Tab Bar with 2nd page selected

Gibt es sowieso dieses Verhalten zu deaktivieren, und lassen Sie es nur 4 Registerkarten sein. Beachten Sie, dass dieses Verhalten nicht auftritt, wenn 3 Registerkarten vorhanden sind. Das Symbol und der Text werden nur verdunkelt und geringfügig vergrößert. Beide sind jedoch sichtbar.

BEARBEITEN: Ich habe die in den Kommentaren vorgeschlagene Antwort ausprobiert, aber wie gesagt, bin ich nicht sicher, ob dies dasselbe Problem lösen soll, und ändert in keinem Fall das Verhalten.

5
bobwki

Es sieht so aus, als würden Sie nach dieser (noch nicht implementierten) Funktion suchen: [Verbesserung] Implementiert den festen Modus für die untere Navigationsleiste Android (Github)

Ich könnte es folgendermaßen lösen James Montemagno Tutorial: Entfernen des BottomNavigationView-Symbols Verschieben in Xamarin.Android und Implementieren meines eigenen benutzerdefinierten Renderers für Registerseiten:

using Android.Content;
using Android.Support.Design.Internal;
using Android.Views;
using FixedTabbedPage.Droid.CustomRenderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms.Platform.Android.AppCompat;

[Assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))]
namespace FixedTabbedPage.Droid.CustomRenderers
{
    public class CustomTabbedPageRenderer : TabbedPageRenderer
    {
        public CustomTabbedPageRenderer(Context context) : base(context) { }

        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);

            if (ViewGroup != null && ViewGroup.ChildCount > 0)
            {
                BottomNavigationMenuView bottomNavigationMenuView = FindChildOfType<BottomNavigationMenuView>(ViewGroup);

                if (bottomNavigationMenuView != null)
                {
                    var shiftMode = bottomNavigationMenuView.Class.GetDeclaredField("mShiftingMode");

                    shiftMode.Accessible = true;
                    shiftMode.SetBoolean(bottomNavigationMenuView, false);
                    shiftMode.Accessible = false;
                    shiftMode.Dispose();

                    for (var i = 0; i < bottomNavigationMenuView.ChildCount; i++)
                    {
                        var item = bottomNavigationMenuView.GetChildAt(i) as BottomNavigationItemView;
                        if (item == null) continue;                         

                        item.SetShiftingMode(false);
                        item.SetChecked(item.ItemData.IsChecked);
                    }

                    if (bottomNavigationMenuView.ChildCount > 0) bottomNavigationMenuView.UpdateMenuView();
                }
            }
        }

        private T FindChildOfType<T>(ViewGroup viewGroup) where T : Android.Views.View
        {
            if (viewGroup == null || viewGroup.ChildCount == 0) return null;

            for (var i = 0; i < viewGroup.ChildCount; i++)
            {
                var child = viewGroup.GetChildAt(i);

                var typedChild = child as T;
                if (typedChild != null) return typedChild;

                if (!(child is ViewGroup)) continue;

                var result = FindChildOfType<T>(child as ViewGroup);

                if (result != null) return result;
            }

            return null;
        }
    }
}

Sie müssen diesen Code nur zu Ihrer Android-Lösung hinzufügen (Namespaces umgestalten), und hier ist das Ergebnis:

Bottom Fixed TabbedPage on Android

5
J. Aguilar

Zum Deaktivieren des Tab-Streifens können Sie PlatformConfiguration in Ihrer TabbedPage-Klasse verwenden

public partial class MyTabbedPage : TabbedPage
{
    public MainTabbedPage ()
    {
        InitializeComponent();
        this.On<Xamarin.Forms.PlatformConfiguration.Android>().SetIsSwipePagingEnabled(false);    
    }
}

wenn Sie nicht über die MyTabbedPage-Klasse verfügen, fügen Sie sie hinzu, als würde Ihre axml-Dateistruktur so aussehen

<?xml version="1.0" encoding="utf-8" ?>
<MyTabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
         x:Class="XaBLE1.MainPage">   
</MyTabbedPage>
1
CGPA6.4