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>
此时显示效果如下图所示。
参与评论
手机查看
返回顶部