考虑一个带有“主页”和“个人资料”按钮的标签栏,当我单击任一页面时,我在两个页面之间切换,在“主页”页面上,用户可以在导航堆栈中向上导航多次,但仍将焦点放在“主页”选项卡上表明这是用户来自的地方。
现在,在 iOS 上,每当用户从导航堆栈的高处单击“主页”时,用户就会弹出到 root 并且一切都很好,但在 android 上并非如此,在 android 上,用户必须一次弹出一页通过单击后退按钮进入根目录。
这是预期的行为吗,我做错了什么,有人知道我可以做些什么来获得所需的行为吗?
考虑一个带有“主页”和“个人资料”按钮的标签栏,当我单击任一页面时,我在两个页面之间切换,在“主页”页面上,用户可以在导航堆栈中向上导航多次,但仍将焦点放在“主页”选项卡上表明这是用户来自的地方。
现在,在 iOS 上,每当用户从导航堆栈的高处单击“主页”时,用户就会弹出到 root 并且一切都很好,但在 android 上并非如此,在 android 上,用户必须一次弹出一页通过单击后退按钮进入根目录。
这是预期的行为吗,我做错了什么,有人知道我可以做些什么来获得所需的行为吗?
这是 iOS 和 Android 之间的预期行为。
如果你需要让 Android 和 iOS 有同样的效果,你需要自定义TabbedPageRenderer来实现。并且底部标签栏效果可以自定义一个FreshTabbedNavigationContainer。最后,我们将使用MessagingCenter将消息发送到 Forms 以弹出到 Root Page。
例如,CustomFreshTabbedNavigationContainer类:
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);
});
}
}
在App.xaml.cs中使用:
public App()
{
InitializeComponent();
var container = new CustomFreshTabbedNavigationContainer();
container.AddTab<FirstPageModel>("Home", default);
container.AddTab<ProfilePageModel>("Profile", default);
MainPage = container;
}
现在我们将在 Android 中创建一个CustomTabbedPageRenderer :
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;
}
}
效果:
注意:如果需要和Android中的顶部Tabbar一样的效果,在CustomTabbedPageRenderer
. 你可以看看这个讨论。