【问题标题】:Bottom Tabs for Xamarin.Android (in Xamarin.forms app)Xamarin.Android 的底部选项卡(在 Xamarin.forms 应用程序中)
【发布时间】:2017-11-11 23:44:50
【问题描述】:

我正在使用 Xamarin.forms 制作应用程序。

您都知道 Xamarin.forms 的 Android 常规标签页位于顶部。 因为如果它是尊重 Android UX 的原生 Android 应用程序,它应该在那里。

但现在情况发生了变化。 甚至谷歌也宣布了新的底部标签栏,称为“底部导航”。 https://github.com/roughike/BottomBar 许多主要应用都在使用底部标签栏。

但我不能使用新的底部导航。 因为我的应用程序基于 Xamarin.forms 并使用表单中的 TabbedPage。 如果我尝试使用底部导航,它会更复杂。

(我也在用表单制作 iOS 应用)

所以最好的方法是将原生选项卡移到底部。

所以我找到了这个。 (也许老了) http://envyandroid.com/align-tabhost-at-bottom/

但不知道如何在 Xamarin.Android 中使用。 你能帮帮我吗?

【问题讨论】:

    标签: tabs xamarin.android xamarin.forms


    【解决方案1】:

    遇到了同样的问题,尝试从 GitHub 上的代码创建自定义 TabbedPageRenderer,但由于多个类和接口的范围为内部,所以没有运气。找到了一个解决方案,虽然很老套,但在我们的案例中似乎可以正常工作。

    只需创建一个继承自 TabbedPage 的新 BottomTabbedPage,这样您就可以链接一个新的 Renderer for Android,然后创建一个新的 Renderer,如下所示:

    [assembly: ExportRenderer(typeof(BottomTabbedPage), typeof(BottomTabbedPageRenderer))]
    namespace My.XForms.Droid.Renderers
    {
        public class BottomTabbedPageRenderer : TabbedPageRenderer
        {
            protected override void OnLayout(bool changed, int l, int t, int r, int b)
            {
                InvertLayoutThroughScale();
    
                base.OnLayout(changed, l, t, r, b);
            }
    
            private void InvertLayoutThroughScale()
            {
                ViewGroup.ScaleY = -1;
    
                TabLayout tabLayout = null;
                ViewPager viewPager = null;
    
                for (int i = 0; i < ChildCount; ++i)
                {
                    Android.Views.View view = (Android.Views.View)GetChildAt(i);
                    if (view is TabLayout) tabLayout = (TabLayout)view;
                    else if (view is ViewPager) viewPager = (ViewPager)view;
                }
    
                tabLayout.ScaleY = viewPager.ScaleY = -1;
                viewPager.SetPadding(0, -tabLayout.MeasuredHeight, 0, 0);
            }
        }
    }
    

    仅缩放页面布局然后再次缩放子级并不能解决问题,因为原始 TabbedPageRenderer 将 ViewPager 填充为不与 TabLayout 重叠,因此您包含的页面会出现起始间隙,因此插入负填充解决这个问题。

    不是一个理想的解决方案,只是工作,但至少你没有运行完整的 TabbedPage 实现。

    【讨论】:

    • 非常感谢 Pablo 提供的代码。我真的很感激。很抱歉没有更新问题。你能检查一下吗? forums.xamarin.com/discussion/comment/211381#Comment_211381
    • 有人使用bottomTab 制作了XF 代码。一切似乎都很好。唯一的问题是,如果你推送新的 contentPage,Bottombar 会消失。
    • 我也会试试你的代码。谢谢。我真的很困惑,很难做出让应用拥有更好用户体验的决定。
    • 我的一个同事尝试了这条路线,但无法让它发挥作用,我加入了他的行列,为这项任务提供了一些帮助。尝试了我能想到的所有方法,例如更改渲染器上的布局覆盖 OnElementChanged 方法,但也没有运气。我在和他开玩笑说只是将页面倒置,然后以这种方式解决了这个问题哈哈。
    • @PabloLópezMartínez 但是您的代码在底部移动标签,但在每个页面的顶部留出空间,我该如何解决这个大问题
    【解决方案2】:

    对 Xamarin 表单使用 BottomNavigationBarXF NuGet 包。
    结果:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多