使用Xamarin.Forms在Android的选项卡式页面中隐藏底部的选项卡栏

时间:2020-06-12 17:21:35

标签: android xamarin.forms android-bottomnav android-bottomnavigationview

我创建了一个选项卡式页面,并将导航栏设置在底部。现在,我需要在特定页面上隐藏导航栏。对于iOS,我使用了以下渲染器:here,但找不到适用于Android的类似解决方案。我用这个尝试过:

public TabbedPageRendererDroid(Context context) : base(context)
        {

        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "IsHidden")
            {
                TabLayout TabsLayout = null;
                for (int i = 0; i < ChildCount; ++i)
                {
                    Android.Views.View view = (Android.Views.View)GetChildAt(i);
                    if (view is TabLayout)
                        TabsLayout = (TabLayout)view;
                }
                if ((Element as CustomTabbedPage).IsHidden)
                {
                    TabsLayout.Visibility = ViewStates.Invisible;
                }
                else
                {
                    TabsLayout.Visibility = ViewStates.Visible;
                }
            }
        }

这仅适用于顶部的普通导航栏,而不适用于底部的导航栏,并且应用程序因以下错误而崩溃:System.NullReferenceException

有什么针对Android的解决方案,请先谢谢。

2 个答案:

答案 0 :(得分:1)

如果要将其隐藏在自定义渲染器中,则可以使用以下代码隐藏bottom navigation bar

    public class ExtendedTabbedPageRenderer: TabbedPageRenderer
    {
        public ExtendedTabbedPageRenderer(Context context) : base(context) { }
        protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement == null && e.NewElement != null)
            {
                for (int i = 0; i <= this.ViewGroup.ChildCount - 1; i++)
                {
                    var childView = this.ViewGroup.GetChildAt(i);
                    if (childView is ViewGroup viewGroup)
                    {
                        for (int j = 0; j <= viewGroup.ChildCount - 1; j++)
                        {
                            var childRelativeLayoutView = viewGroup.GetChildAt(j);
                            if (childRelativeLayoutView is BottomNavigationView)
                            {
                                ((BottomNavigationView)childRelativeLayoutView).Visibility = ViewStates.Gone;
                            }
                        }
                    }
                }
            }
        }

顺便说一句,如果您显示一些需要使用导航隐藏BottomNavigationView的页面。您不需要使用上面的代码。只需使用await Navigation.PushAsync(new ItemDetailPage(new ItemDetailViewModel(item)));,此BottomNavigationView就会像这个GIF一样被隐藏。

enter image description here

答案 1 :(得分:1)

@Leon Lu-MSFT的贡献帮助我找到了解决方案。这是可与this一起使用的Android Renderer。

https://