我想知道是否可以区分Xamarin.Android中的BottomNavigationView上的滑动和点击。
我实施了:
void NavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
{
if (_viewPager.CurrentItem == 0)
{
_fm1.Pop2Root();
}
_viewPager.SetCurrentItem(e.Item.Order, true);
}
但是滑动和点击之间没有区别。我想在用户滑动时保持加载当前页面,但如果用户点击了当前选择的BottomNavigationView选项卡,则弹出到根目录。
这就是我的Pop2Root方法的样子(不是真的很重要):
public void Pop2Root()
{
_wv.LoadUrl("https://www.bitchute.com/");
}
我只想要一个单独的事件来进行点击和滑动。
我不是在找人做我的工作。一旦我弄明白,我会发布完整的解决方案(一如既往)。无论是否可能,我正在寻找的是是或否答案;然后我会照顾其余的。我之前在TabHost上实现了一个点击监听器,但这是一个完全不同的UI元素:
https://github.com/hexag0d/BitChute_Mobile_Android_a2/blob/2.7641/Activities/ClickListeners.cs
如果你想在整个项目上有更多的上下文,这里是MainActivity.cs,那么你可以回到其余部分:
https://github.com/hexag0d/BitChute_Mobile_Android_BottomNav/blob/master/MainActivity.cs
提前致谢
这个问题的答案是肯定的。用户滑动时调用ViewPager_PageSelected方法。在选项卡上调用NavigationView_NavigationItemSelected。有趣的是,如果在NavigationView_NavigationItemSelected方法之前放置ViewPager_PageSelected方法,则在用户按下a选项卡之前不会调用ViewPager_PageSelected,直到调用此方法为止:
_viewPager.SetCurrentItem(e.Item.Order, true);
在此之后,将调用ViewPager_PageSelected方法并再次调用NavigationView_NavigationItemSelected。所以我决定这样做,并设置一个自定义int。这样,两种方法每个用户交互只调用一次,并且存在差异。
(注意事件BottomNavigationView.NavigationItemSelectedEventArgs和ViewPager.PageSelectedEventArgs)
//put all of this inside your MainActivity.cs
int _tabSelected;
void NavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
{
if (_tabSelected == e.Item.Order)
{
switch (_viewPager.CurrentItem)
{
case 0:
_fm1.Pop2Root();
break;
case 1:
_fm2.Pop2Root();
break;
case 2:
_fm3.Pop2Root();
break;
case 3:
_fm4.Pop2Root();
break;
case 4:
_fm5.Pop2Root();
break;
}
}
else
{
_viewPager.SetCurrentItem(e.Item.Order, true);
}
}
private void ViewPager_PageSelected(object sender, ViewPager.PageSelectedEventArgs e)
{
_menu = _navigationView.Menu.GetItem(e.Position);
_navigationView.SelectedItemId = _menu.ItemId;
_tabSelected = _viewPager.CurrentItem;
}