Erlo

Xamarim.Forms TabbedPage 在安卓中使用底部Tab页的显示功能完善

2019-05-14 22:02:06 发布   538 浏览  
页面报错/反馈
收藏 1 赞

Xamarin.Forms的TabbedPage已经加入了在安卓系统中,在底部显示Tab选项的属性,

只需要在TabbedPage中引用安卓命名空间,并加入底部显示的属性即可。

xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"

 android:TabbedPage.ToolbarPlacement="Bottom"

iOS中默认的TabbedPage就是在下方显示,不需要进行特殊处理。

但是在安卓中,当Tab页多于四个时,TabbedPage会进入一个名为shift mode的状态,此时只会显示图标,以及当前激活的Tab页的文字。

如下图所示。

如果恰好没有设置Tab页的图标,你会发现未激活的Tab页看不到了。

 

默认模式明显不符合日常使用习惯,官方issue中也提到了这个问题,但是目前没有推出更新。

如果现在想要避免这个显示效果,则需要使用CustomeRenderer避免此问题。

首先在共享项目中,新建一个名为BottomTabPage的类,继承TabbedPage即可。

 

iOS项目不需要处理,安卓项目需要实现Renderer,目前我的实现代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using Android.Content;
 5 using Android.Support.Design.Widget;
 6 using Android.Views;
 7 using LearningProject.Control;
 8 using LearningProject.Droid.Renderers;
 9 using Xamarin.Forms;
10 using Xamarin.Forms.Platform.Android;
11 using Xamarin.Forms.Platform.Android.AppCompat;
12 using View = Android.Views.View;
13 
14 [assembly: ExportRenderer(typeof(BottomTabPage), typeof(BottomTabPageRenderer))]
15 namespace Test.Droid.Renderers
16 {
17     public class BottomTabPageRenderer : TabbedPageRenderer
18     {
19         private bool _isShiftModeSet;
20         public BottomTabPageRenderer(Context context) : base(context)
21         {
22         }
23 
24         protected override void OnLayout(bool changed, int l, int t, int r, int b)
25         {
26             base.OnLayout(changed, l, t, r, b);
27             try
28             {
29                 if (!_isShiftModeSet)
30                 {
31                     var children = GetAllChildViews(ViewGroup);
32 
33                     if (children.SingleOrDefault(x => x is BottomNavigationView) is BottomNavigationView bottomNav)
34                     {
35                         bottomNav.SetShiftMode(false, false);
36                         _isShiftModeSet = true;
37                     }
38                 }
39             }
40             catch (Exception e)
41             {
42                 Console.WriteLine($"Error setting ShiftMode: {e}");
43             }
44         }
45         private List<View> GetAllChildViews(View view)
46         {
47             if (!(view is ViewGroup group))
48             {
49                 return new List<View> { view };
50             }
51 
52             var result = new List<View>();
53 
54             for (int i = 0; i < group.ChildCount; i++)
55             {
56                 var child = group.GetChildAt(i);
57 
58                 var childList = new List<View> { child };
59                 childList.AddRange(GetAllChildViews(child));
60 
61                 result.AddRange(childList);
62             }
63 
64             return result.Distinct().ToList();
65         }
66     }
67 }

 

然后将页面中,TabbedPage的引用改为共享项目中的BottomTabPage控件即可。

<controls:BottomTabPage x:Class="Test.Views.MainView"
                        xmlns="http://xamarin.com/schemas/2014/forms"
                        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                        xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
                        xmlns:controls="clr-namespace:Test.Control"
                        xmlns:iOS="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
                        xmlns:views="clr-namespace:Test.Views"
                        android:TabbedPage.ToolbarPlacement="Bottom"
                        iOS:Page.UseSafeArea="true">
</controls:BottomTabPage>

此时显示效果如下图所示。

 

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认