首页 > 解决方案 > 旋转时Xamarin Android BottomNavigationView不可见

问题描述

您好,我有这个应用程序,我需要在设备旋转时让bottomTabBar 消失。问题是每次我旋转它都不能按我想要的方式工作。

这是我的代码:

 public override void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
    {
        if (_bottomNavigationView == null)
            _bottomNavigationView = bottomView;

        if (bottomViewHeight == 0)
            bottomViewHeight = bottomView.LayoutParameters.Height;
        _IShellAppearanceElement = appearance;

        var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
        var rotation = mainDisplayInfo.Rotation;

        if (rotation == DisplayRotation.Rotation270 || rotation == DisplayRotation.Rotation90)
        {
            var parameters = bottomView.LayoutParameters;
            parameters.Height = 0;
            bottomView.LayoutParameters = parameters;
            bottomView.Visibility = ViewStates.Invisible;
            bottomView.SetPadding(0, 0, 0, -1);
        }
        else
        {
            bottomView.Visibility = ViewStates.Visible;
            var parameters = bottomView.LayoutParameters;
            parameters.Height = 200;
            bottomView.LayoutParameters = parameters;
            bottomView.SetPadding(0, 0, 0, 100);
        }
    }

这是纵向模式

这是纵向模式

这是横向模式 在此处输入图像描述

在此处输入图像描述 这是回到纵向模式

标签: c#xamarinxamarin.formsxamarin.android

解决方案


我使用了您的实现,并且SetAppearance在旋转屏幕时从未调用过。它仅在视图更改时调用(例如,我单击选项卡或其他内容)。如您所说,我会仔细检查您的情况是否真的在每次更改屏幕方向时都会调用该方法。

另一方面,通过覆盖OnConfigurationChanged方法,我能够获得您想要的行为。不确定其余代码的外观如何,但您可以像我一样做一些事情。在MainActivity我添加static public BottomNavigationView bv;和实施OnConfigurationChanged

        public override void OnConfigurationChanged(Android.Content.Res.Configuration newConfig)
        {
            base.OnConfigurationChanged(newConfig);
            if (bv != null)
            {
                if (newConfig.Orientation == Android.Content.Res.Orientation.Landscape)
                { 
                    var parameters = bv.LayoutParameters;
                    parameters.Height = 0;
                    bv.LayoutParameters = parameters;
                    bv.Visibility = ViewStates.Invisible;
                    bv.SetPadding(0, 0, 0, -1);
                }
                else
                { 
                    bv.Visibility = ViewStates.Visible;
                    var parameters = bv.LayoutParameters;
                    parameters.Height = 200;
                    bv.LayoutParameters = parameters;
                    bv.SetPadding(0, 0, 0, 100);
                }
            }
        }

然后,在我实施 IShellBottomNavViewAppearanceTracker 的其他文件中(我猜你在某处有):

        public void SetAppearance(BottomNavigationView bottomView, ShellAppearance appearance)
        {
            //Some other code if necessary

            if (MainActivity.bv == null)
                MainActivity.bv = bottomView;

            //Some other code if necessary
        }

我不确定_bottomNavigationView你的情况是什么以及你如何使用它,但我想你可以做一些类似的事情,就像我对bv.


推荐阅读