问题描述
考虑一个带有“主页”和“配置文件”按钮的标签栏,当我单击任一按钮时,我会在两个页面之间切换,在“主页”页面上,用户可以在导航堆栈中多次向上导航,但仍将重点放在“主页”标签,表明这是用户的来源。
现在,在iOS上,每当用户从导航堆栈中的高处单击“主页”时,该用户就会被弹出到root用户,一切都很好,但是在android上不是这种情况,但是在android上,用户必须弹出一页一次,只需单击后退按钮即可进入根目录。
这是预期的行为吗,我在实现过程中做错了什么?[0],是否有人对我可以做些什么来获得所需的行为有任何线索?
[0] https://git.sr.ht/~ivar/FreshTabbedPageAndroidInconvenience/tree
解决方法
这是iOS和Android之间的预期行为。
如果需要使Android与iOS具有相同的效果,则需要自定义 TabbedPageRenderer 来实现。底部的标签栏效果可以自定义 FreshTabbedNavigationContainer 。最后,我们将使用 MessagingCenter 将邮件发送到表单以弹出到根页面。
例如, CustomFreshTabbedNavigationContainer 类:
false"
在 App.xaml.cs 中使用:
public class CustomFreshTabbedNavigationContainer : FreshTabbedNavigationContainer
{
public CustomFreshTabbedNavigationContainer()
{
On<Android>().SetToolbarPlacement(ToolbarPlacement.Bottom);
MessagingCenter.Subscribe<object>(this,"Hi",(sender) =>
{
// Do something whenever the "Hi" message is received
PopToRoot(true);
});
}
}
现在,我们将在Android中创建一个 CustomTabbedPageRenderer :
public App()
{
InitializeComponent();
var container = new CustomFreshTabbedNavigationContainer();
container.AddTab<FirstPageModel>("Home",default);
container.AddTab<ProfilePageModel>("Profile",default);
MainPage = container;
}
效果:
注意:如果需要与Android顶部的Tabbar具有相同的效果,则public class CustomTabbedPageRenderer : TabbedPageRenderer,BottomNavigationView.IOnNavigationItemSelectedListener
{
public CustomTabbedPageRenderer(Context context) : base(context)
{
}
int previousItemId = 0;
bool BottomNavigationView.IOnNavigationItemSelectedListener.OnNavigationItemSelected(IMenuItem item)
{
base.OnNavigationItemSelected(item);
if (item.IsChecked)
{
if (previousItemId != item.ItemId)
{
previousItemId = item.ItemId;
}
else
{
Console.WriteLine("ok");
MessagingCenter.Send<object>(this,"Hi");
}
}
return true;
}
}
中会有不同的代码。您可以看看这个discussion。