Xamarin.android 如何在Android上强制Xamarin表单选项卡页面以编程方式滚动到所选选项卡?

Xamarin.android 如何在Android上强制Xamarin表单选项卡页面以编程方式滚动到所选选项卡?,xamarin.android,xamarin.forms,Xamarin.android,Xamarin.forms,如果我的标签超过了屏幕尺寸,在Android上我可以将tabmode设置为可滚动。但是如果我通过编程将所选项目(使用SelectedItem或CurrentPage)设置为屏幕外的选项卡,在Android上,选项卡不会滚动 在UWP上工作正常,在iOS上不工作,因为它使用“更多”按钮。但在Android上,它选择正确的子项,显示其内容,但不将选项卡滚动到正确的选项卡(如果不在屏幕上) 如果我手动滚动选项卡,会选择正确的选项卡,但这种用户体验非常糟糕 很明显,Xamarin表单有一个bug,但我不

如果我的标签超过了屏幕尺寸,在Android上我可以将tabmode设置为可滚动。但是如果我通过编程将所选项目(使用SelectedItem或CurrentPage)设置为屏幕外的选项卡,在Android上,选项卡不会滚动

在UWP上工作正常,在iOS上不工作,因为它使用“更多”按钮。但在Android上,它选择正确的子项,显示其内容,但不将选项卡滚动到正确的选项卡(如果不在屏幕上)

如果我手动滚动选项卡,会选择正确的选项卡,但这种用户体验非常糟糕

很明显,Xamarin表单有一个bug,但我不希望很快会有任何改变,所以有没有关于如何以编程方式滚动选项卡的想法

下面是一个示例应用程序的bug报告,以查看问题

但是如果我通过编程将所选项目(使用SelectedItem或CurrentPage)设置为屏幕外的选项卡,在Android上,选项卡不会滚动。代码如下:

您可以在Xamarin.Android中编写一个脚本,将选项卡滚动到右侧选项卡

 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);
     }
 }
公共类MyTabbedPageRenderer:TabbedPageRenderer
{
私有TabLayout TabLayout=null;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
this.tabLayout=(tabLayout)this.GetChildAt(1);
var selectPosition=this.tabLayout.SelectedTabPosition;
tabLayout.TabMode=tabLayout.mode可滚动;
tabLayout.TabGravity=tabLayout.GravityFill;
Handler h=新的Handler();
动作myAction=()=>
{
tabLayout.GetTabAt(selectPosition.Select();
};
h、 延迟后(myAction,1);
}
}
效果:

但是如果我通过编程将所选项目(使用SelectedItem或CurrentPage)设置为屏幕外的选项卡,在Android上,选项卡不会滚动。代码如下:

您可以在Xamarin.Android中编写一个脚本,将选项卡滚动到右侧选项卡

 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);
     }
 }
公共类MyTabbedPageRenderer:TabbedPageRenderer
{
私有TabLayout TabLayout=null;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
this.tabLayout=(tabLayout)this.GetChildAt(1);
var selectPosition=this.tabLayout.SelectedTabPosition;
tabLayout.TabMode=tabLayout.mode可滚动;
tabLayout.TabGravity=tabLayout.GravityFill;
Handler h=新的Handler();
动作myAction=()=>
{
tabLayout.GetTabAt(selectPosition.Select();
};
h、 延迟后(myAction,1);
}
}
效果:


完美的解决方案,谢谢!我想念本土技能。我希望您不介意问您是否可以在iOS中使用相同的可滚动标签系统,而不使用“更多”按钮。如果你知道答案,我可以问一个新问题。完美的解决方案,谢谢!我想念本土技能。我希望您不介意问您是否可以在iOS中使用相同的可滚动标签系统,而不使用“更多”按钮。如果你知道答案,我可以问一个新问题。