Xamarin:有没有办法区分滑动和BottomNavigationView点击?

时间:2019-04-16 01:54:16

标签: c# xamarin.android bottomnavigationview

我想知道是否可以区分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

预先感谢

1 个答案:

答案 0 :(得分:0)

这个问题的答案是肯定的。用户滑动时将调用ViewPager_PageSelected方法。在按下Tab键时会调用NavigationView_NavigationItemSelected。有趣的是,如果将ViewPager_PageSelected方法放在之前 NavigationView_NavigationItemSelected方法中,则当用户按下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;
}