如何强制Xamarin Forms TabbedPage在Android上以编程方式滚动到选定的选项卡?

时间:2017-07-27 16:26:22

标签: xamarin.android xamarin.forms

如果我有更多选项卡而不是适合屏幕,那么在Android上我可以将tabmode设置为可滚动。但是,如果我以编程方式将所选项目(使用SelectedItem或CurrentPage)设置为屏幕外的选项卡,则在Android上,选项卡不会滚动。

在UWP上,它运行良好,在iOS上它不起作用,因为它使用"更多"按钮。但是在Android上,它选择了正确的Child,显示其内容,但没有将标签滚动到右边的标签(如果它不在屏幕外)。

如果我手动滚动标签,则会选择右侧标签,但此用户体验非常糟糕。

显然是Xamarin Forms的一个错误,但我很快就没想到会有任何变化,所以有关如何以编程方式滚动标签的任何想法?

这是带有示例应用程序的错误报告,以查看问题。

https://bugzilla.xamarin.com/show_bug.cgi?id=58441

1 个答案:

答案 0 :(得分:3)

  

但是,如果我以编程方式将所选项目(使用SelectedItem或CurrentPage)设置为屏幕外的选项卡,则在Android上,选项卡不会滚动。像这样的代码:

您可以在Xamarin.Android中编写TabbedPageRenderer,将标签滚动到右侧标签。

 public class MyTabbedPageRenderer : TabbedPageRenderer
 {
     private TabLayout tabLayout = null;

     protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
     {
         base.OnElementChanged(e);

         this.tabLayout = (TabLayout)this.GetChildAt(1);

         var selectPosition = this.tabLayout.SelectedTabPosition;

         tabLayout.TabMode = TabLayout.ModeScrollable;
         tabLayout.TabGravity = TabLayout.GravityFill;

         Handler h = new Handler();
         Action myAction = () =>
         {
             tabLayout.GetTabAt(selectPosition).Select();
         };

         h.PostDelayed(myAction, 1);
     }
 }

效果:

enter image description here